17db96d56Sopenharmony_ci"""Unit tests for memory-based file-like objects. 27db96d56Sopenharmony_ciStringIO -- for unicode strings 37db96d56Sopenharmony_ciBytesIO -- for bytes 47db96d56Sopenharmony_ci""" 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ciimport unittest 77db96d56Sopenharmony_cifrom test import support 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ciimport io 107db96d56Sopenharmony_ciimport _pyio as pyio 117db96d56Sopenharmony_ciimport pickle 127db96d56Sopenharmony_ciimport sys 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ciclass IntLike: 157db96d56Sopenharmony_ci def __init__(self, num): 167db96d56Sopenharmony_ci self._num = num 177db96d56Sopenharmony_ci def __index__(self): 187db96d56Sopenharmony_ci return self._num 197db96d56Sopenharmony_ci __int__ = __index__ 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_ciclass MemorySeekTestMixin: 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_ci def testInit(self): 247db96d56Sopenharmony_ci buf = self.buftype("1234567890") 257db96d56Sopenharmony_ci bytesIo = self.ioclass(buf) 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ci def testRead(self): 287db96d56Sopenharmony_ci buf = self.buftype("1234567890") 297db96d56Sopenharmony_ci bytesIo = self.ioclass(buf) 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci self.assertEqual(buf[:1], bytesIo.read(1)) 327db96d56Sopenharmony_ci self.assertEqual(buf[1:5], bytesIo.read(4)) 337db96d56Sopenharmony_ci self.assertEqual(buf[5:], bytesIo.read(900)) 347db96d56Sopenharmony_ci self.assertEqual(self.EOF, bytesIo.read()) 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci def testReadNoArgs(self): 377db96d56Sopenharmony_ci buf = self.buftype("1234567890") 387db96d56Sopenharmony_ci bytesIo = self.ioclass(buf) 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci self.assertEqual(buf, bytesIo.read()) 417db96d56Sopenharmony_ci self.assertEqual(self.EOF, bytesIo.read()) 427db96d56Sopenharmony_ci 437db96d56Sopenharmony_ci def testSeek(self): 447db96d56Sopenharmony_ci buf = self.buftype("1234567890") 457db96d56Sopenharmony_ci bytesIo = self.ioclass(buf) 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ci bytesIo.read(5) 487db96d56Sopenharmony_ci bytesIo.seek(0) 497db96d56Sopenharmony_ci self.assertEqual(buf, bytesIo.read()) 507db96d56Sopenharmony_ci 517db96d56Sopenharmony_ci bytesIo.seek(3) 527db96d56Sopenharmony_ci self.assertEqual(buf[3:], bytesIo.read()) 537db96d56Sopenharmony_ci self.assertRaises(TypeError, bytesIo.seek, 0.0) 547db96d56Sopenharmony_ci 557db96d56Sopenharmony_ci def testTell(self): 567db96d56Sopenharmony_ci buf = self.buftype("1234567890") 577db96d56Sopenharmony_ci bytesIo = self.ioclass(buf) 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci self.assertEqual(0, bytesIo.tell()) 607db96d56Sopenharmony_ci bytesIo.seek(5) 617db96d56Sopenharmony_ci self.assertEqual(5, bytesIo.tell()) 627db96d56Sopenharmony_ci bytesIo.seek(10000) 637db96d56Sopenharmony_ci self.assertEqual(10000, bytesIo.tell()) 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ciclass MemoryTestMixin: 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_ci def test_detach(self): 697db96d56Sopenharmony_ci buf = self.ioclass() 707db96d56Sopenharmony_ci self.assertRaises(self.UnsupportedOperation, buf.detach) 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci def write_ops(self, f, t): 737db96d56Sopenharmony_ci self.assertEqual(f.write(t("blah.")), 5) 747db96d56Sopenharmony_ci self.assertEqual(f.seek(0), 0) 757db96d56Sopenharmony_ci self.assertEqual(f.write(t("Hello.")), 6) 767db96d56Sopenharmony_ci self.assertEqual(f.tell(), 6) 777db96d56Sopenharmony_ci self.assertEqual(f.seek(5), 5) 787db96d56Sopenharmony_ci self.assertEqual(f.tell(), 5) 797db96d56Sopenharmony_ci self.assertEqual(f.write(t(" world\n\n\n")), 9) 807db96d56Sopenharmony_ci self.assertEqual(f.seek(0), 0) 817db96d56Sopenharmony_ci self.assertEqual(f.write(t("h")), 1) 827db96d56Sopenharmony_ci self.assertEqual(f.truncate(12), 12) 837db96d56Sopenharmony_ci self.assertEqual(f.tell(), 1) 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ci def test_write(self): 867db96d56Sopenharmony_ci buf = self.buftype("hello world\n") 877db96d56Sopenharmony_ci memio = self.ioclass(buf) 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ci self.write_ops(memio, self.buftype) 907db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf) 917db96d56Sopenharmony_ci memio = self.ioclass() 927db96d56Sopenharmony_ci self.write_ops(memio, self.buftype) 937db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf) 947db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.write, None) 957db96d56Sopenharmony_ci memio.close() 967db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.write, self.buftype("")) 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci def test_writelines(self): 997db96d56Sopenharmony_ci buf = self.buftype("1234567890") 1007db96d56Sopenharmony_ci memio = self.ioclass() 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci self.assertEqual(memio.writelines([buf] * 100), None) 1037db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf * 100) 1047db96d56Sopenharmony_ci memio.writelines([]) 1057db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf * 100) 1067db96d56Sopenharmony_ci memio = self.ioclass() 1077db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.writelines, [buf] + [1]) 1087db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf) 1097db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.writelines, None) 1107db96d56Sopenharmony_ci memio.close() 1117db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.writelines, []) 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci def test_writelines_error(self): 1147db96d56Sopenharmony_ci memio = self.ioclass() 1157db96d56Sopenharmony_ci def error_gen(): 1167db96d56Sopenharmony_ci yield self.buftype('spam') 1177db96d56Sopenharmony_ci raise KeyboardInterrupt 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci self.assertRaises(KeyboardInterrupt, memio.writelines, error_gen()) 1207db96d56Sopenharmony_ci 1217db96d56Sopenharmony_ci def test_truncate(self): 1227db96d56Sopenharmony_ci buf = self.buftype("1234567890") 1237db96d56Sopenharmony_ci memio = self.ioclass(buf) 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.truncate, -1) 1267db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.truncate, IntLike(-1)) 1277db96d56Sopenharmony_ci memio.seek(6) 1287db96d56Sopenharmony_ci self.assertEqual(memio.truncate(IntLike(8)), 8) 1297db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf[:8]) 1307db96d56Sopenharmony_ci self.assertEqual(memio.truncate(), 6) 1317db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf[:6]) 1327db96d56Sopenharmony_ci self.assertEqual(memio.truncate(4), 4) 1337db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf[:4]) 1347db96d56Sopenharmony_ci self.assertEqual(memio.tell(), 6) 1357db96d56Sopenharmony_ci memio.seek(0, 2) 1367db96d56Sopenharmony_ci memio.write(buf) 1377db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf[:4] + buf) 1387db96d56Sopenharmony_ci pos = memio.tell() 1397db96d56Sopenharmony_ci self.assertEqual(memio.truncate(None), pos) 1407db96d56Sopenharmony_ci self.assertEqual(memio.tell(), pos) 1417db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.truncate, '0') 1427db96d56Sopenharmony_ci memio.close() 1437db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.truncate, 0) 1447db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.truncate, IntLike(0)) 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_ci def test_init(self): 1477db96d56Sopenharmony_ci buf = self.buftype("1234567890") 1487db96d56Sopenharmony_ci memio = self.ioclass(buf) 1497db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf) 1507db96d56Sopenharmony_ci memio = self.ioclass(None) 1517db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), self.EOF) 1527db96d56Sopenharmony_ci memio.__init__(buf * 2) 1537db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf * 2) 1547db96d56Sopenharmony_ci memio.__init__(buf) 1557db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf) 1567db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__init__, []) 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ci def test_read(self): 1597db96d56Sopenharmony_ci buf = self.buftype("1234567890") 1607db96d56Sopenharmony_ci memio = self.ioclass(buf) 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci self.assertEqual(memio.read(0), self.EOF) 1637db96d56Sopenharmony_ci self.assertEqual(memio.read(1), buf[:1]) 1647db96d56Sopenharmony_ci self.assertEqual(memio.read(4), buf[1:5]) 1657db96d56Sopenharmony_ci self.assertEqual(memio.read(900), buf[5:]) 1667db96d56Sopenharmony_ci self.assertEqual(memio.read(), self.EOF) 1677db96d56Sopenharmony_ci memio.seek(0) 1687db96d56Sopenharmony_ci self.assertEqual(memio.read(IntLike(0)), self.EOF) 1697db96d56Sopenharmony_ci self.assertEqual(memio.read(IntLike(1)), buf[:1]) 1707db96d56Sopenharmony_ci self.assertEqual(memio.read(IntLike(4)), buf[1:5]) 1717db96d56Sopenharmony_ci self.assertEqual(memio.read(IntLike(900)), buf[5:]) 1727db96d56Sopenharmony_ci memio.seek(0) 1737db96d56Sopenharmony_ci self.assertEqual(memio.read(), buf) 1747db96d56Sopenharmony_ci self.assertEqual(memio.read(), self.EOF) 1757db96d56Sopenharmony_ci self.assertEqual(memio.tell(), 10) 1767db96d56Sopenharmony_ci memio.seek(0) 1777db96d56Sopenharmony_ci self.assertEqual(memio.read(-1), buf) 1787db96d56Sopenharmony_ci memio.seek(0) 1797db96d56Sopenharmony_ci self.assertEqual(memio.read(IntLike(-1)), buf) 1807db96d56Sopenharmony_ci memio.seek(0) 1817db96d56Sopenharmony_ci self.assertEqual(type(memio.read()), type(buf)) 1827db96d56Sopenharmony_ci memio.seek(100) 1837db96d56Sopenharmony_ci self.assertEqual(type(memio.read()), type(buf)) 1847db96d56Sopenharmony_ci memio.seek(0) 1857db96d56Sopenharmony_ci self.assertEqual(memio.read(None), buf) 1867db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.read, '') 1877db96d56Sopenharmony_ci memio.seek(len(buf) + 1) 1887db96d56Sopenharmony_ci self.assertEqual(memio.read(1), self.EOF) 1897db96d56Sopenharmony_ci memio.seek(len(buf) + 1) 1907db96d56Sopenharmony_ci self.assertEqual(memio.read(IntLike(1)), self.EOF) 1917db96d56Sopenharmony_ci memio.seek(len(buf) + 1) 1927db96d56Sopenharmony_ci self.assertEqual(memio.read(), self.EOF) 1937db96d56Sopenharmony_ci memio.close() 1947db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.read) 1957db96d56Sopenharmony_ci 1967db96d56Sopenharmony_ci def test_readline(self): 1977db96d56Sopenharmony_ci buf = self.buftype("1234567890\n") 1987db96d56Sopenharmony_ci memio = self.ioclass(buf * 2) 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ci self.assertEqual(memio.readline(0), self.EOF) 2017db96d56Sopenharmony_ci self.assertEqual(memio.readline(IntLike(0)), self.EOF) 2027db96d56Sopenharmony_ci self.assertEqual(memio.readline(), buf) 2037db96d56Sopenharmony_ci self.assertEqual(memio.readline(), buf) 2047db96d56Sopenharmony_ci self.assertEqual(memio.readline(), self.EOF) 2057db96d56Sopenharmony_ci memio.seek(0) 2067db96d56Sopenharmony_ci self.assertEqual(memio.readline(5), buf[:5]) 2077db96d56Sopenharmony_ci self.assertEqual(memio.readline(5), buf[5:10]) 2087db96d56Sopenharmony_ci self.assertEqual(memio.readline(5), buf[10:15]) 2097db96d56Sopenharmony_ci memio.seek(0) 2107db96d56Sopenharmony_ci self.assertEqual(memio.readline(IntLike(5)), buf[:5]) 2117db96d56Sopenharmony_ci self.assertEqual(memio.readline(IntLike(5)), buf[5:10]) 2127db96d56Sopenharmony_ci self.assertEqual(memio.readline(IntLike(5)), buf[10:15]) 2137db96d56Sopenharmony_ci memio.seek(0) 2147db96d56Sopenharmony_ci self.assertEqual(memio.readline(-1), buf) 2157db96d56Sopenharmony_ci memio.seek(0) 2167db96d56Sopenharmony_ci self.assertEqual(memio.readline(IntLike(-1)), buf) 2177db96d56Sopenharmony_ci memio.seek(0) 2187db96d56Sopenharmony_ci self.assertEqual(memio.readline(0), self.EOF) 2197db96d56Sopenharmony_ci self.assertEqual(memio.readline(IntLike(0)), self.EOF) 2207db96d56Sopenharmony_ci # Issue #24989: Buffer overread 2217db96d56Sopenharmony_ci memio.seek(len(buf) * 2 + 1) 2227db96d56Sopenharmony_ci self.assertEqual(memio.readline(), self.EOF) 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_ci buf = self.buftype("1234567890\n") 2257db96d56Sopenharmony_ci memio = self.ioclass((buf * 3)[:-1]) 2267db96d56Sopenharmony_ci self.assertEqual(memio.readline(), buf) 2277db96d56Sopenharmony_ci self.assertEqual(memio.readline(), buf) 2287db96d56Sopenharmony_ci self.assertEqual(memio.readline(), buf[:-1]) 2297db96d56Sopenharmony_ci self.assertEqual(memio.readline(), self.EOF) 2307db96d56Sopenharmony_ci memio.seek(0) 2317db96d56Sopenharmony_ci self.assertEqual(type(memio.readline()), type(buf)) 2327db96d56Sopenharmony_ci self.assertEqual(memio.readline(), buf) 2337db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.readline, '') 2347db96d56Sopenharmony_ci memio.close() 2357db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.readline) 2367db96d56Sopenharmony_ci 2377db96d56Sopenharmony_ci def test_readlines(self): 2387db96d56Sopenharmony_ci buf = self.buftype("1234567890\n") 2397db96d56Sopenharmony_ci memio = self.ioclass(buf * 10) 2407db96d56Sopenharmony_ci 2417db96d56Sopenharmony_ci self.assertEqual(memio.readlines(), [buf] * 10) 2427db96d56Sopenharmony_ci memio.seek(5) 2437db96d56Sopenharmony_ci self.assertEqual(memio.readlines(), [buf[5:]] + [buf] * 9) 2447db96d56Sopenharmony_ci memio.seek(0) 2457db96d56Sopenharmony_ci self.assertEqual(memio.readlines(15), [buf] * 2) 2467db96d56Sopenharmony_ci memio.seek(0) 2477db96d56Sopenharmony_ci self.assertEqual(memio.readlines(-1), [buf] * 10) 2487db96d56Sopenharmony_ci memio.seek(0) 2497db96d56Sopenharmony_ci self.assertEqual(memio.readlines(0), [buf] * 10) 2507db96d56Sopenharmony_ci memio.seek(0) 2517db96d56Sopenharmony_ci self.assertEqual(type(memio.readlines()[0]), type(buf)) 2527db96d56Sopenharmony_ci memio.seek(0) 2537db96d56Sopenharmony_ci self.assertEqual(memio.readlines(None), [buf] * 10) 2547db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.readlines, '') 2557db96d56Sopenharmony_ci # Issue #24989: Buffer overread 2567db96d56Sopenharmony_ci memio.seek(len(buf) * 10 + 1) 2577db96d56Sopenharmony_ci self.assertEqual(memio.readlines(), []) 2587db96d56Sopenharmony_ci memio.close() 2597db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.readlines) 2607db96d56Sopenharmony_ci 2617db96d56Sopenharmony_ci def test_iterator(self): 2627db96d56Sopenharmony_ci buf = self.buftype("1234567890\n") 2637db96d56Sopenharmony_ci memio = self.ioclass(buf * 10) 2647db96d56Sopenharmony_ci 2657db96d56Sopenharmony_ci self.assertEqual(iter(memio), memio) 2667db96d56Sopenharmony_ci self.assertTrue(hasattr(memio, '__iter__')) 2677db96d56Sopenharmony_ci self.assertTrue(hasattr(memio, '__next__')) 2687db96d56Sopenharmony_ci i = 0 2697db96d56Sopenharmony_ci for line in memio: 2707db96d56Sopenharmony_ci self.assertEqual(line, buf) 2717db96d56Sopenharmony_ci i += 1 2727db96d56Sopenharmony_ci self.assertEqual(i, 10) 2737db96d56Sopenharmony_ci memio.seek(0) 2747db96d56Sopenharmony_ci i = 0 2757db96d56Sopenharmony_ci for line in memio: 2767db96d56Sopenharmony_ci self.assertEqual(line, buf) 2777db96d56Sopenharmony_ci i += 1 2787db96d56Sopenharmony_ci self.assertEqual(i, 10) 2797db96d56Sopenharmony_ci # Issue #24989: Buffer overread 2807db96d56Sopenharmony_ci memio.seek(len(buf) * 10 + 1) 2817db96d56Sopenharmony_ci self.assertEqual(list(memio), []) 2827db96d56Sopenharmony_ci memio = self.ioclass(buf * 2) 2837db96d56Sopenharmony_ci memio.close() 2847db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.__next__) 2857db96d56Sopenharmony_ci 2867db96d56Sopenharmony_ci def test_getvalue(self): 2877db96d56Sopenharmony_ci buf = self.buftype("1234567890") 2887db96d56Sopenharmony_ci memio = self.ioclass(buf) 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf) 2917db96d56Sopenharmony_ci memio.read() 2927db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf) 2937db96d56Sopenharmony_ci self.assertEqual(type(memio.getvalue()), type(buf)) 2947db96d56Sopenharmony_ci memio = self.ioclass(buf * 1000) 2957db96d56Sopenharmony_ci self.assertEqual(memio.getvalue()[-3:], self.buftype("890")) 2967db96d56Sopenharmony_ci memio = self.ioclass(buf) 2977db96d56Sopenharmony_ci memio.close() 2987db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.getvalue) 2997db96d56Sopenharmony_ci 3007db96d56Sopenharmony_ci def test_seek(self): 3017db96d56Sopenharmony_ci buf = self.buftype("1234567890") 3027db96d56Sopenharmony_ci memio = self.ioclass(buf) 3037db96d56Sopenharmony_ci 3047db96d56Sopenharmony_ci memio.read(5) 3057db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.seek, -1) 3067db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.seek, 1, -1) 3077db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.seek, 1, 3) 3087db96d56Sopenharmony_ci self.assertEqual(memio.seek(0), 0) 3097db96d56Sopenharmony_ci self.assertEqual(memio.seek(0, 0), 0) 3107db96d56Sopenharmony_ci self.assertEqual(memio.read(), buf) 3117db96d56Sopenharmony_ci self.assertEqual(memio.seek(3), 3) 3127db96d56Sopenharmony_ci self.assertEqual(memio.seek(0, 1), 3) 3137db96d56Sopenharmony_ci self.assertEqual(memio.read(), buf[3:]) 3147db96d56Sopenharmony_ci self.assertEqual(memio.seek(len(buf)), len(buf)) 3157db96d56Sopenharmony_ci self.assertEqual(memio.read(), self.EOF) 3167db96d56Sopenharmony_ci memio.seek(len(buf) + 1) 3177db96d56Sopenharmony_ci self.assertEqual(memio.read(), self.EOF) 3187db96d56Sopenharmony_ci self.assertEqual(memio.seek(0, 2), len(buf)) 3197db96d56Sopenharmony_ci self.assertEqual(memio.read(), self.EOF) 3207db96d56Sopenharmony_ci memio.close() 3217db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.seek, 0) 3227db96d56Sopenharmony_ci 3237db96d56Sopenharmony_ci def test_overseek(self): 3247db96d56Sopenharmony_ci buf = self.buftype("1234567890") 3257db96d56Sopenharmony_ci memio = self.ioclass(buf) 3267db96d56Sopenharmony_ci 3277db96d56Sopenharmony_ci self.assertEqual(memio.seek(len(buf) + 1), 11) 3287db96d56Sopenharmony_ci self.assertEqual(memio.read(), self.EOF) 3297db96d56Sopenharmony_ci self.assertEqual(memio.tell(), 11) 3307db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf) 3317db96d56Sopenharmony_ci memio.write(self.EOF) 3327db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf) 3337db96d56Sopenharmony_ci memio.write(buf) 3347db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf + self.buftype('\0') + buf) 3357db96d56Sopenharmony_ci 3367db96d56Sopenharmony_ci def test_tell(self): 3377db96d56Sopenharmony_ci buf = self.buftype("1234567890") 3387db96d56Sopenharmony_ci memio = self.ioclass(buf) 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ci self.assertEqual(memio.tell(), 0) 3417db96d56Sopenharmony_ci memio.seek(5) 3427db96d56Sopenharmony_ci self.assertEqual(memio.tell(), 5) 3437db96d56Sopenharmony_ci memio.seek(10000) 3447db96d56Sopenharmony_ci self.assertEqual(memio.tell(), 10000) 3457db96d56Sopenharmony_ci memio.close() 3467db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.tell) 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ci def test_flush(self): 3497db96d56Sopenharmony_ci buf = self.buftype("1234567890") 3507db96d56Sopenharmony_ci memio = self.ioclass(buf) 3517db96d56Sopenharmony_ci 3527db96d56Sopenharmony_ci self.assertEqual(memio.flush(), None) 3537db96d56Sopenharmony_ci 3547db96d56Sopenharmony_ci def test_flags(self): 3557db96d56Sopenharmony_ci memio = self.ioclass() 3567db96d56Sopenharmony_ci 3577db96d56Sopenharmony_ci self.assertEqual(memio.writable(), True) 3587db96d56Sopenharmony_ci self.assertEqual(memio.readable(), True) 3597db96d56Sopenharmony_ci self.assertEqual(memio.seekable(), True) 3607db96d56Sopenharmony_ci self.assertEqual(memio.isatty(), False) 3617db96d56Sopenharmony_ci self.assertEqual(memio.closed, False) 3627db96d56Sopenharmony_ci memio.close() 3637db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.writable) 3647db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.readable) 3657db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.seekable) 3667db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.isatty) 3677db96d56Sopenharmony_ci self.assertEqual(memio.closed, True) 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ci def test_subclassing(self): 3707db96d56Sopenharmony_ci buf = self.buftype("1234567890") 3717db96d56Sopenharmony_ci def test1(): 3727db96d56Sopenharmony_ci class MemIO(self.ioclass): 3737db96d56Sopenharmony_ci pass 3747db96d56Sopenharmony_ci m = MemIO(buf) 3757db96d56Sopenharmony_ci return m.getvalue() 3767db96d56Sopenharmony_ci def test2(): 3777db96d56Sopenharmony_ci class MemIO(self.ioclass): 3787db96d56Sopenharmony_ci def __init__(me, a, b): 3797db96d56Sopenharmony_ci self.ioclass.__init__(me, a) 3807db96d56Sopenharmony_ci m = MemIO(buf, None) 3817db96d56Sopenharmony_ci return m.getvalue() 3827db96d56Sopenharmony_ci self.assertEqual(test1(), buf) 3837db96d56Sopenharmony_ci self.assertEqual(test2(), buf) 3847db96d56Sopenharmony_ci 3857db96d56Sopenharmony_ci def test_instance_dict_leak(self): 3867db96d56Sopenharmony_ci # Test case for issue #6242. 3877db96d56Sopenharmony_ci # This will be caught by regrtest.py -R if this leak. 3887db96d56Sopenharmony_ci for _ in range(100): 3897db96d56Sopenharmony_ci memio = self.ioclass() 3907db96d56Sopenharmony_ci memio.foo = 1 3917db96d56Sopenharmony_ci 3927db96d56Sopenharmony_ci def test_pickling(self): 3937db96d56Sopenharmony_ci buf = self.buftype("1234567890") 3947db96d56Sopenharmony_ci memio = self.ioclass(buf) 3957db96d56Sopenharmony_ci memio.foo = 42 3967db96d56Sopenharmony_ci memio.seek(2) 3977db96d56Sopenharmony_ci 3987db96d56Sopenharmony_ci class PickleTestMemIO(self.ioclass): 3997db96d56Sopenharmony_ci def __init__(me, initvalue, foo): 4007db96d56Sopenharmony_ci self.ioclass.__init__(me, initvalue) 4017db96d56Sopenharmony_ci me.foo = foo 4027db96d56Sopenharmony_ci # __getnewargs__ is undefined on purpose. This checks that PEP 307 4037db96d56Sopenharmony_ci # is used to provide pickling support. 4047db96d56Sopenharmony_ci 4057db96d56Sopenharmony_ci # Pickle expects the class to be on the module level. Here we use a 4067db96d56Sopenharmony_ci # little hack to allow the PickleTestMemIO class to derive from 4077db96d56Sopenharmony_ci # self.ioclass without having to define all combinations explicitly on 4087db96d56Sopenharmony_ci # the module-level. 4097db96d56Sopenharmony_ci import __main__ 4107db96d56Sopenharmony_ci PickleTestMemIO.__module__ = '__main__' 4117db96d56Sopenharmony_ci PickleTestMemIO.__qualname__ = PickleTestMemIO.__name__ 4127db96d56Sopenharmony_ci __main__.PickleTestMemIO = PickleTestMemIO 4137db96d56Sopenharmony_ci submemio = PickleTestMemIO(buf, 80) 4147db96d56Sopenharmony_ci submemio.seek(2) 4157db96d56Sopenharmony_ci 4167db96d56Sopenharmony_ci # We only support pickle protocol 2 and onward since we use extended 4177db96d56Sopenharmony_ci # __reduce__ API of PEP 307 to provide pickling support. 4187db96d56Sopenharmony_ci for proto in range(2, pickle.HIGHEST_PROTOCOL + 1): 4197db96d56Sopenharmony_ci for obj in (memio, submemio): 4207db96d56Sopenharmony_ci obj2 = pickle.loads(pickle.dumps(obj, protocol=proto)) 4217db96d56Sopenharmony_ci self.assertEqual(obj.getvalue(), obj2.getvalue()) 4227db96d56Sopenharmony_ci self.assertEqual(obj.__class__, obj2.__class__) 4237db96d56Sopenharmony_ci self.assertEqual(obj.foo, obj2.foo) 4247db96d56Sopenharmony_ci self.assertEqual(obj.tell(), obj2.tell()) 4257db96d56Sopenharmony_ci obj2.close() 4267db96d56Sopenharmony_ci self.assertRaises(ValueError, pickle.dumps, obj2, proto) 4277db96d56Sopenharmony_ci del __main__.PickleTestMemIO 4287db96d56Sopenharmony_ci 4297db96d56Sopenharmony_ci 4307db96d56Sopenharmony_ciclass PyBytesIOTest(MemoryTestMixin, MemorySeekTestMixin, unittest.TestCase): 4317db96d56Sopenharmony_ci # Test _pyio.BytesIO; class also inherited for testing C implementation 4327db96d56Sopenharmony_ci 4337db96d56Sopenharmony_ci UnsupportedOperation = pyio.UnsupportedOperation 4347db96d56Sopenharmony_ci 4357db96d56Sopenharmony_ci @staticmethod 4367db96d56Sopenharmony_ci def buftype(s): 4377db96d56Sopenharmony_ci return s.encode("ascii") 4387db96d56Sopenharmony_ci ioclass = pyio.BytesIO 4397db96d56Sopenharmony_ci EOF = b"" 4407db96d56Sopenharmony_ci 4417db96d56Sopenharmony_ci def test_getbuffer(self): 4427db96d56Sopenharmony_ci memio = self.ioclass(b"1234567890") 4437db96d56Sopenharmony_ci buf = memio.getbuffer() 4447db96d56Sopenharmony_ci self.assertEqual(bytes(buf), b"1234567890") 4457db96d56Sopenharmony_ci memio.seek(5) 4467db96d56Sopenharmony_ci buf = memio.getbuffer() 4477db96d56Sopenharmony_ci self.assertEqual(bytes(buf), b"1234567890") 4487db96d56Sopenharmony_ci # Trying to change the size of the BytesIO while a buffer is exported 4497db96d56Sopenharmony_ci # raises a BufferError. 4507db96d56Sopenharmony_ci self.assertRaises(BufferError, memio.write, b'x' * 100) 4517db96d56Sopenharmony_ci self.assertRaises(BufferError, memio.truncate) 4527db96d56Sopenharmony_ci self.assertRaises(BufferError, memio.close) 4537db96d56Sopenharmony_ci self.assertFalse(memio.closed) 4547db96d56Sopenharmony_ci # Mutating the buffer updates the BytesIO 4557db96d56Sopenharmony_ci buf[3:6] = b"abc" 4567db96d56Sopenharmony_ci self.assertEqual(bytes(buf), b"123abc7890") 4577db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), b"123abc7890") 4587db96d56Sopenharmony_ci # After the buffer gets released, we can resize and close the BytesIO 4597db96d56Sopenharmony_ci # again 4607db96d56Sopenharmony_ci del buf 4617db96d56Sopenharmony_ci support.gc_collect() 4627db96d56Sopenharmony_ci memio.truncate() 4637db96d56Sopenharmony_ci memio.close() 4647db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.getbuffer) 4657db96d56Sopenharmony_ci 4667db96d56Sopenharmony_ci def test_read1(self): 4677db96d56Sopenharmony_ci buf = self.buftype("1234567890") 4687db96d56Sopenharmony_ci self.assertEqual(self.ioclass(buf).read1(), buf) 4697db96d56Sopenharmony_ci self.assertEqual(self.ioclass(buf).read1(-1), buf) 4707db96d56Sopenharmony_ci 4717db96d56Sopenharmony_ci def test_readinto(self): 4727db96d56Sopenharmony_ci buf = self.buftype("1234567890") 4737db96d56Sopenharmony_ci memio = self.ioclass(buf) 4747db96d56Sopenharmony_ci 4757db96d56Sopenharmony_ci b = bytearray(b"hello") 4767db96d56Sopenharmony_ci self.assertEqual(memio.readinto(b), 5) 4777db96d56Sopenharmony_ci self.assertEqual(b, b"12345") 4787db96d56Sopenharmony_ci self.assertEqual(memio.readinto(b), 5) 4797db96d56Sopenharmony_ci self.assertEqual(b, b"67890") 4807db96d56Sopenharmony_ci self.assertEqual(memio.readinto(b), 0) 4817db96d56Sopenharmony_ci self.assertEqual(b, b"67890") 4827db96d56Sopenharmony_ci b = bytearray(b"hello world") 4837db96d56Sopenharmony_ci memio.seek(0) 4847db96d56Sopenharmony_ci self.assertEqual(memio.readinto(b), 10) 4857db96d56Sopenharmony_ci self.assertEqual(b, b"1234567890d") 4867db96d56Sopenharmony_ci b = bytearray(b"") 4877db96d56Sopenharmony_ci memio.seek(0) 4887db96d56Sopenharmony_ci self.assertEqual(memio.readinto(b), 0) 4897db96d56Sopenharmony_ci self.assertEqual(b, b"") 4907db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.readinto, '') 4917db96d56Sopenharmony_ci import array 4927db96d56Sopenharmony_ci a = array.array('b', b"hello world") 4937db96d56Sopenharmony_ci memio = self.ioclass(buf) 4947db96d56Sopenharmony_ci memio.readinto(a) 4957db96d56Sopenharmony_ci self.assertEqual(a.tobytes(), b"1234567890d") 4967db96d56Sopenharmony_ci memio.close() 4977db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.readinto, b) 4987db96d56Sopenharmony_ci memio = self.ioclass(b"123") 4997db96d56Sopenharmony_ci b = bytearray() 5007db96d56Sopenharmony_ci memio.seek(42) 5017db96d56Sopenharmony_ci memio.readinto(b) 5027db96d56Sopenharmony_ci self.assertEqual(b, b"") 5037db96d56Sopenharmony_ci 5047db96d56Sopenharmony_ci def test_relative_seek(self): 5057db96d56Sopenharmony_ci buf = self.buftype("1234567890") 5067db96d56Sopenharmony_ci memio = self.ioclass(buf) 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ci self.assertEqual(memio.seek(-1, 1), 0) 5097db96d56Sopenharmony_ci self.assertEqual(memio.seek(3, 1), 3) 5107db96d56Sopenharmony_ci self.assertEqual(memio.seek(-4, 1), 0) 5117db96d56Sopenharmony_ci self.assertEqual(memio.seek(-1, 2), 9) 5127db96d56Sopenharmony_ci self.assertEqual(memio.seek(1, 1), 10) 5137db96d56Sopenharmony_ci self.assertEqual(memio.seek(1, 2), 11) 5147db96d56Sopenharmony_ci memio.seek(-3, 2) 5157db96d56Sopenharmony_ci self.assertEqual(memio.read(), buf[-3:]) 5167db96d56Sopenharmony_ci memio.seek(0) 5177db96d56Sopenharmony_ci memio.seek(1, 1) 5187db96d56Sopenharmony_ci self.assertEqual(memio.read(), buf[1:]) 5197db96d56Sopenharmony_ci 5207db96d56Sopenharmony_ci def test_unicode(self): 5217db96d56Sopenharmony_ci memio = self.ioclass() 5227db96d56Sopenharmony_ci 5237db96d56Sopenharmony_ci self.assertRaises(TypeError, self.ioclass, "1234567890") 5247db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.write, "1234567890") 5257db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.writelines, ["1234567890"]) 5267db96d56Sopenharmony_ci 5277db96d56Sopenharmony_ci def test_bytes_array(self): 5287db96d56Sopenharmony_ci buf = b"1234567890" 5297db96d56Sopenharmony_ci import array 5307db96d56Sopenharmony_ci a = array.array('b', list(buf)) 5317db96d56Sopenharmony_ci memio = self.ioclass(a) 5327db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf) 5337db96d56Sopenharmony_ci self.assertEqual(memio.write(a), 10) 5347db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf) 5357db96d56Sopenharmony_ci 5367db96d56Sopenharmony_ci def test_issue5449(self): 5377db96d56Sopenharmony_ci buf = self.buftype("1234567890") 5387db96d56Sopenharmony_ci self.ioclass(initial_bytes=buf) 5397db96d56Sopenharmony_ci self.assertRaises(TypeError, self.ioclass, buf, foo=None) 5407db96d56Sopenharmony_ci 5417db96d56Sopenharmony_ci 5427db96d56Sopenharmony_ciclass TextIOTestMixin: 5437db96d56Sopenharmony_ci 5447db96d56Sopenharmony_ci def test_newlines_property(self): 5457db96d56Sopenharmony_ci memio = self.ioclass(newline=None) 5467db96d56Sopenharmony_ci # The C StringIO decodes newlines in write() calls, but the Python 5477db96d56Sopenharmony_ci # implementation only does when reading. This function forces them to 5487db96d56Sopenharmony_ci # be decoded for testing. 5497db96d56Sopenharmony_ci def force_decode(): 5507db96d56Sopenharmony_ci memio.seek(0) 5517db96d56Sopenharmony_ci memio.read() 5527db96d56Sopenharmony_ci self.assertEqual(memio.newlines, None) 5537db96d56Sopenharmony_ci memio.write("a\n") 5547db96d56Sopenharmony_ci force_decode() 5557db96d56Sopenharmony_ci self.assertEqual(memio.newlines, "\n") 5567db96d56Sopenharmony_ci memio.write("b\r\n") 5577db96d56Sopenharmony_ci force_decode() 5587db96d56Sopenharmony_ci self.assertEqual(memio.newlines, ("\n", "\r\n")) 5597db96d56Sopenharmony_ci memio.write("c\rd") 5607db96d56Sopenharmony_ci force_decode() 5617db96d56Sopenharmony_ci self.assertEqual(memio.newlines, ("\r", "\n", "\r\n")) 5627db96d56Sopenharmony_ci 5637db96d56Sopenharmony_ci def test_relative_seek(self): 5647db96d56Sopenharmony_ci memio = self.ioclass() 5657db96d56Sopenharmony_ci 5667db96d56Sopenharmony_ci self.assertRaises(OSError, memio.seek, -1, 1) 5677db96d56Sopenharmony_ci self.assertRaises(OSError, memio.seek, 3, 1) 5687db96d56Sopenharmony_ci self.assertRaises(OSError, memio.seek, -3, 1) 5697db96d56Sopenharmony_ci self.assertRaises(OSError, memio.seek, -1, 2) 5707db96d56Sopenharmony_ci self.assertRaises(OSError, memio.seek, 1, 1) 5717db96d56Sopenharmony_ci self.assertRaises(OSError, memio.seek, 1, 2) 5727db96d56Sopenharmony_ci 5737db96d56Sopenharmony_ci def test_textio_properties(self): 5747db96d56Sopenharmony_ci memio = self.ioclass() 5757db96d56Sopenharmony_ci 5767db96d56Sopenharmony_ci # These are just dummy values but we nevertheless check them for fear 5777db96d56Sopenharmony_ci # of unexpected breakage. 5787db96d56Sopenharmony_ci self.assertIsNone(memio.encoding) 5797db96d56Sopenharmony_ci self.assertIsNone(memio.errors) 5807db96d56Sopenharmony_ci self.assertFalse(memio.line_buffering) 5817db96d56Sopenharmony_ci 5827db96d56Sopenharmony_ci def test_newline_default(self): 5837db96d56Sopenharmony_ci memio = self.ioclass("a\nb\r\nc\rd") 5847db96d56Sopenharmony_ci self.assertEqual(list(memio), ["a\n", "b\r\n", "c\rd"]) 5857db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), "a\nb\r\nc\rd") 5867db96d56Sopenharmony_ci 5877db96d56Sopenharmony_ci memio = self.ioclass() 5887db96d56Sopenharmony_ci self.assertEqual(memio.write("a\nb\r\nc\rd"), 8) 5897db96d56Sopenharmony_ci memio.seek(0) 5907db96d56Sopenharmony_ci self.assertEqual(list(memio), ["a\n", "b\r\n", "c\rd"]) 5917db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), "a\nb\r\nc\rd") 5927db96d56Sopenharmony_ci 5937db96d56Sopenharmony_ci def test_newline_none(self): 5947db96d56Sopenharmony_ci # newline=None 5957db96d56Sopenharmony_ci memio = self.ioclass("a\nb\r\nc\rd", newline=None) 5967db96d56Sopenharmony_ci self.assertEqual(list(memio), ["a\n", "b\n", "c\n", "d"]) 5977db96d56Sopenharmony_ci memio.seek(0) 5987db96d56Sopenharmony_ci self.assertEqual(memio.read(1), "a") 5997db96d56Sopenharmony_ci self.assertEqual(memio.read(2), "\nb") 6007db96d56Sopenharmony_ci self.assertEqual(memio.read(2), "\nc") 6017db96d56Sopenharmony_ci self.assertEqual(memio.read(1), "\n") 6027db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), "a\nb\nc\nd") 6037db96d56Sopenharmony_ci 6047db96d56Sopenharmony_ci memio = self.ioclass(newline=None) 6057db96d56Sopenharmony_ci self.assertEqual(2, memio.write("a\n")) 6067db96d56Sopenharmony_ci self.assertEqual(3, memio.write("b\r\n")) 6077db96d56Sopenharmony_ci self.assertEqual(3, memio.write("c\rd")) 6087db96d56Sopenharmony_ci memio.seek(0) 6097db96d56Sopenharmony_ci self.assertEqual(memio.read(), "a\nb\nc\nd") 6107db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), "a\nb\nc\nd") 6117db96d56Sopenharmony_ci 6127db96d56Sopenharmony_ci memio = self.ioclass("a\r\nb", newline=None) 6137db96d56Sopenharmony_ci self.assertEqual(memio.read(3), "a\nb") 6147db96d56Sopenharmony_ci 6157db96d56Sopenharmony_ci def test_newline_empty(self): 6167db96d56Sopenharmony_ci # newline="" 6177db96d56Sopenharmony_ci memio = self.ioclass("a\nb\r\nc\rd", newline="") 6187db96d56Sopenharmony_ci self.assertEqual(list(memio), ["a\n", "b\r\n", "c\r", "d"]) 6197db96d56Sopenharmony_ci memio.seek(0) 6207db96d56Sopenharmony_ci self.assertEqual(memio.read(4), "a\nb\r") 6217db96d56Sopenharmony_ci self.assertEqual(memio.read(2), "\nc") 6227db96d56Sopenharmony_ci self.assertEqual(memio.read(1), "\r") 6237db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), "a\nb\r\nc\rd") 6247db96d56Sopenharmony_ci 6257db96d56Sopenharmony_ci memio = self.ioclass(newline="") 6267db96d56Sopenharmony_ci self.assertEqual(2, memio.write("a\n")) 6277db96d56Sopenharmony_ci self.assertEqual(2, memio.write("b\r")) 6287db96d56Sopenharmony_ci self.assertEqual(2, memio.write("\nc")) 6297db96d56Sopenharmony_ci self.assertEqual(2, memio.write("\rd")) 6307db96d56Sopenharmony_ci memio.seek(0) 6317db96d56Sopenharmony_ci self.assertEqual(list(memio), ["a\n", "b\r\n", "c\r", "d"]) 6327db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), "a\nb\r\nc\rd") 6337db96d56Sopenharmony_ci 6347db96d56Sopenharmony_ci def test_newline_lf(self): 6357db96d56Sopenharmony_ci # newline="\n" 6367db96d56Sopenharmony_ci memio = self.ioclass("a\nb\r\nc\rd", newline="\n") 6377db96d56Sopenharmony_ci self.assertEqual(list(memio), ["a\n", "b\r\n", "c\rd"]) 6387db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), "a\nb\r\nc\rd") 6397db96d56Sopenharmony_ci 6407db96d56Sopenharmony_ci memio = self.ioclass(newline="\n") 6417db96d56Sopenharmony_ci self.assertEqual(memio.write("a\nb\r\nc\rd"), 8) 6427db96d56Sopenharmony_ci memio.seek(0) 6437db96d56Sopenharmony_ci self.assertEqual(list(memio), ["a\n", "b\r\n", "c\rd"]) 6447db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), "a\nb\r\nc\rd") 6457db96d56Sopenharmony_ci 6467db96d56Sopenharmony_ci def test_newline_cr(self): 6477db96d56Sopenharmony_ci # newline="\r" 6487db96d56Sopenharmony_ci memio = self.ioclass("a\nb\r\nc\rd", newline="\r") 6497db96d56Sopenharmony_ci self.assertEqual(memio.read(), "a\rb\r\rc\rd") 6507db96d56Sopenharmony_ci memio.seek(0) 6517db96d56Sopenharmony_ci self.assertEqual(list(memio), ["a\r", "b\r", "\r", "c\r", "d"]) 6527db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), "a\rb\r\rc\rd") 6537db96d56Sopenharmony_ci 6547db96d56Sopenharmony_ci memio = self.ioclass(newline="\r") 6557db96d56Sopenharmony_ci self.assertEqual(memio.write("a\nb\r\nc\rd"), 8) 6567db96d56Sopenharmony_ci memio.seek(0) 6577db96d56Sopenharmony_ci self.assertEqual(list(memio), ["a\r", "b\r", "\r", "c\r", "d"]) 6587db96d56Sopenharmony_ci memio.seek(0) 6597db96d56Sopenharmony_ci self.assertEqual(memio.readlines(), ["a\r", "b\r", "\r", "c\r", "d"]) 6607db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), "a\rb\r\rc\rd") 6617db96d56Sopenharmony_ci 6627db96d56Sopenharmony_ci def test_newline_crlf(self): 6637db96d56Sopenharmony_ci # newline="\r\n" 6647db96d56Sopenharmony_ci memio = self.ioclass("a\nb\r\nc\rd", newline="\r\n") 6657db96d56Sopenharmony_ci self.assertEqual(memio.read(), "a\r\nb\r\r\nc\rd") 6667db96d56Sopenharmony_ci memio.seek(0) 6677db96d56Sopenharmony_ci self.assertEqual(list(memio), ["a\r\n", "b\r\r\n", "c\rd"]) 6687db96d56Sopenharmony_ci memio.seek(0) 6697db96d56Sopenharmony_ci self.assertEqual(memio.readlines(), ["a\r\n", "b\r\r\n", "c\rd"]) 6707db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), "a\r\nb\r\r\nc\rd") 6717db96d56Sopenharmony_ci 6727db96d56Sopenharmony_ci memio = self.ioclass(newline="\r\n") 6737db96d56Sopenharmony_ci self.assertEqual(memio.write("a\nb\r\nc\rd"), 8) 6747db96d56Sopenharmony_ci memio.seek(0) 6757db96d56Sopenharmony_ci self.assertEqual(list(memio), ["a\r\n", "b\r\r\n", "c\rd"]) 6767db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), "a\r\nb\r\r\nc\rd") 6777db96d56Sopenharmony_ci 6787db96d56Sopenharmony_ci def test_issue5265(self): 6797db96d56Sopenharmony_ci # StringIO can duplicate newlines in universal newlines mode 6807db96d56Sopenharmony_ci memio = self.ioclass("a\r\nb\r\n", newline=None) 6817db96d56Sopenharmony_ci self.assertEqual(memio.read(5), "a\nb\n") 6827db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), "a\nb\n") 6837db96d56Sopenharmony_ci 6847db96d56Sopenharmony_ci def test_newline_argument(self): 6857db96d56Sopenharmony_ci self.assertRaises(TypeError, self.ioclass, newline=b"\n") 6867db96d56Sopenharmony_ci self.assertRaises(ValueError, self.ioclass, newline="error") 6877db96d56Sopenharmony_ci # These should not raise an error 6887db96d56Sopenharmony_ci for newline in (None, "", "\n", "\r", "\r\n"): 6897db96d56Sopenharmony_ci self.ioclass(newline=newline) 6907db96d56Sopenharmony_ci 6917db96d56Sopenharmony_ci 6927db96d56Sopenharmony_ciclass PyStringIOTest(MemoryTestMixin, MemorySeekTestMixin, 6937db96d56Sopenharmony_ci TextIOTestMixin, unittest.TestCase): 6947db96d56Sopenharmony_ci buftype = str 6957db96d56Sopenharmony_ci ioclass = pyio.StringIO 6967db96d56Sopenharmony_ci UnsupportedOperation = pyio.UnsupportedOperation 6977db96d56Sopenharmony_ci EOF = "" 6987db96d56Sopenharmony_ci 6997db96d56Sopenharmony_ci def test_lone_surrogates(self): 7007db96d56Sopenharmony_ci # Issue #20424 7017db96d56Sopenharmony_ci memio = self.ioclass('\ud800') 7027db96d56Sopenharmony_ci self.assertEqual(memio.read(), '\ud800') 7037db96d56Sopenharmony_ci 7047db96d56Sopenharmony_ci memio = self.ioclass() 7057db96d56Sopenharmony_ci memio.write('\ud800') 7067db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), '\ud800') 7077db96d56Sopenharmony_ci 7087db96d56Sopenharmony_ci 7097db96d56Sopenharmony_ciclass PyStringIOPickleTest(TextIOTestMixin, unittest.TestCase): 7107db96d56Sopenharmony_ci """Test if pickle restores properly the internal state of StringIO. 7117db96d56Sopenharmony_ci """ 7127db96d56Sopenharmony_ci buftype = str 7137db96d56Sopenharmony_ci UnsupportedOperation = pyio.UnsupportedOperation 7147db96d56Sopenharmony_ci EOF = "" 7157db96d56Sopenharmony_ci 7167db96d56Sopenharmony_ci class ioclass(pyio.StringIO): 7177db96d56Sopenharmony_ci def __new__(cls, *args, **kwargs): 7187db96d56Sopenharmony_ci return pickle.loads(pickle.dumps(pyio.StringIO(*args, **kwargs))) 7197db96d56Sopenharmony_ci def __init__(self, *args, **kwargs): 7207db96d56Sopenharmony_ci pass 7217db96d56Sopenharmony_ci 7227db96d56Sopenharmony_ci 7237db96d56Sopenharmony_ciclass CBytesIOTest(PyBytesIOTest): 7247db96d56Sopenharmony_ci ioclass = io.BytesIO 7257db96d56Sopenharmony_ci UnsupportedOperation = io.UnsupportedOperation 7267db96d56Sopenharmony_ci 7277db96d56Sopenharmony_ci def test_getstate(self): 7287db96d56Sopenharmony_ci memio = self.ioclass() 7297db96d56Sopenharmony_ci state = memio.__getstate__() 7307db96d56Sopenharmony_ci self.assertEqual(len(state), 3) 7317db96d56Sopenharmony_ci bytearray(state[0]) # Check if state[0] supports the buffer interface. 7327db96d56Sopenharmony_ci self.assertIsInstance(state[1], int) 7337db96d56Sopenharmony_ci if state[2] is not None: 7347db96d56Sopenharmony_ci self.assertIsInstance(state[2], dict) 7357db96d56Sopenharmony_ci memio.close() 7367db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.__getstate__) 7377db96d56Sopenharmony_ci 7387db96d56Sopenharmony_ci def test_setstate(self): 7397db96d56Sopenharmony_ci # This checks whether __setstate__ does proper input validation. 7407db96d56Sopenharmony_ci memio = self.ioclass() 7417db96d56Sopenharmony_ci memio.__setstate__((b"no error", 0, None)) 7427db96d56Sopenharmony_ci memio.__setstate__((bytearray(b"no error"), 0, None)) 7437db96d56Sopenharmony_ci memio.__setstate__((b"no error", 0, {'spam': 3})) 7447db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.__setstate__, (b"", -1, None)) 7457db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__setstate__, ("unicode", 0, None)) 7467db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__setstate__, (b"", 0.0, None)) 7477db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__setstate__, (b"", 0, 0)) 7487db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__setstate__, (b"len-test", 0)) 7497db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__setstate__) 7507db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__setstate__, 0) 7517db96d56Sopenharmony_ci memio.close() 7527db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.__setstate__, (b"closed", 0, None)) 7537db96d56Sopenharmony_ci 7547db96d56Sopenharmony_ci check_sizeof = support.check_sizeof 7557db96d56Sopenharmony_ci 7567db96d56Sopenharmony_ci @support.cpython_only 7577db96d56Sopenharmony_ci def test_sizeof(self): 7587db96d56Sopenharmony_ci basesize = support.calcobjsize('P2n2Pn') 7597db96d56Sopenharmony_ci check = self.check_sizeof 7607db96d56Sopenharmony_ci self.assertEqual(object.__sizeof__(io.BytesIO()), basesize) 7617db96d56Sopenharmony_ci check(io.BytesIO(), basesize ) 7627db96d56Sopenharmony_ci n = 1000 # use a variable to prevent constant folding 7637db96d56Sopenharmony_ci check(io.BytesIO(b'a' * n), basesize + sys.getsizeof(b'a' * n)) 7647db96d56Sopenharmony_ci 7657db96d56Sopenharmony_ci # Various tests of copy-on-write behaviour for BytesIO. 7667db96d56Sopenharmony_ci 7677db96d56Sopenharmony_ci def _test_cow_mutation(self, mutation): 7687db96d56Sopenharmony_ci # Common code for all BytesIO copy-on-write mutation tests. 7697db96d56Sopenharmony_ci imm = b' ' * 1024 7707db96d56Sopenharmony_ci old_rc = sys.getrefcount(imm) 7717db96d56Sopenharmony_ci memio = self.ioclass(imm) 7727db96d56Sopenharmony_ci self.assertEqual(sys.getrefcount(imm), old_rc + 1) 7737db96d56Sopenharmony_ci mutation(memio) 7747db96d56Sopenharmony_ci self.assertEqual(sys.getrefcount(imm), old_rc) 7757db96d56Sopenharmony_ci 7767db96d56Sopenharmony_ci @support.cpython_only 7777db96d56Sopenharmony_ci def test_cow_truncate(self): 7787db96d56Sopenharmony_ci # Ensure truncate causes a copy. 7797db96d56Sopenharmony_ci def mutation(memio): 7807db96d56Sopenharmony_ci memio.truncate(1) 7817db96d56Sopenharmony_ci self._test_cow_mutation(mutation) 7827db96d56Sopenharmony_ci 7837db96d56Sopenharmony_ci @support.cpython_only 7847db96d56Sopenharmony_ci def test_cow_write(self): 7857db96d56Sopenharmony_ci # Ensure write that would not cause a resize still results in a copy. 7867db96d56Sopenharmony_ci def mutation(memio): 7877db96d56Sopenharmony_ci memio.seek(0) 7887db96d56Sopenharmony_ci memio.write(b'foo') 7897db96d56Sopenharmony_ci self._test_cow_mutation(mutation) 7907db96d56Sopenharmony_ci 7917db96d56Sopenharmony_ci @support.cpython_only 7927db96d56Sopenharmony_ci def test_cow_setstate(self): 7937db96d56Sopenharmony_ci # __setstate__ should cause buffer to be released. 7947db96d56Sopenharmony_ci memio = self.ioclass(b'foooooo') 7957db96d56Sopenharmony_ci state = memio.__getstate__() 7967db96d56Sopenharmony_ci def mutation(memio): 7977db96d56Sopenharmony_ci memio.__setstate__(state) 7987db96d56Sopenharmony_ci self._test_cow_mutation(mutation) 7997db96d56Sopenharmony_ci 8007db96d56Sopenharmony_ci @support.cpython_only 8017db96d56Sopenharmony_ci def test_cow_mutable(self): 8027db96d56Sopenharmony_ci # BytesIO should accept only Bytes for copy-on-write sharing, since 8037db96d56Sopenharmony_ci # arbitrary buffer-exporting objects like bytearray() aren't guaranteed 8047db96d56Sopenharmony_ci # to be immutable. 8057db96d56Sopenharmony_ci ba = bytearray(1024) 8067db96d56Sopenharmony_ci old_rc = sys.getrefcount(ba) 8077db96d56Sopenharmony_ci memio = self.ioclass(ba) 8087db96d56Sopenharmony_ci self.assertEqual(sys.getrefcount(ba), old_rc) 8097db96d56Sopenharmony_ci 8107db96d56Sopenharmony_ciclass CStringIOTest(PyStringIOTest): 8117db96d56Sopenharmony_ci ioclass = io.StringIO 8127db96d56Sopenharmony_ci UnsupportedOperation = io.UnsupportedOperation 8137db96d56Sopenharmony_ci 8147db96d56Sopenharmony_ci # XXX: For the Python version of io.StringIO, this is highly 8157db96d56Sopenharmony_ci # dependent on the encoding used for the underlying buffer. 8167db96d56Sopenharmony_ci def test_widechar(self): 8177db96d56Sopenharmony_ci buf = self.buftype("\U0002030a\U00020347") 8187db96d56Sopenharmony_ci memio = self.ioclass(buf) 8197db96d56Sopenharmony_ci 8207db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf) 8217db96d56Sopenharmony_ci self.assertEqual(memio.write(buf), len(buf)) 8227db96d56Sopenharmony_ci self.assertEqual(memio.tell(), len(buf)) 8237db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf) 8247db96d56Sopenharmony_ci self.assertEqual(memio.write(buf), len(buf)) 8257db96d56Sopenharmony_ci self.assertEqual(memio.tell(), len(buf) * 2) 8267db96d56Sopenharmony_ci self.assertEqual(memio.getvalue(), buf + buf) 8277db96d56Sopenharmony_ci 8287db96d56Sopenharmony_ci def test_getstate(self): 8297db96d56Sopenharmony_ci memio = self.ioclass() 8307db96d56Sopenharmony_ci state = memio.__getstate__() 8317db96d56Sopenharmony_ci self.assertEqual(len(state), 4) 8327db96d56Sopenharmony_ci self.assertIsInstance(state[0], str) 8337db96d56Sopenharmony_ci self.assertIsInstance(state[1], str) 8347db96d56Sopenharmony_ci self.assertIsInstance(state[2], int) 8357db96d56Sopenharmony_ci if state[3] is not None: 8367db96d56Sopenharmony_ci self.assertIsInstance(state[3], dict) 8377db96d56Sopenharmony_ci memio.close() 8387db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.__getstate__) 8397db96d56Sopenharmony_ci 8407db96d56Sopenharmony_ci def test_setstate(self): 8417db96d56Sopenharmony_ci # This checks whether __setstate__ does proper input validation. 8427db96d56Sopenharmony_ci memio = self.ioclass() 8437db96d56Sopenharmony_ci memio.__setstate__(("no error", "\n", 0, None)) 8447db96d56Sopenharmony_ci memio.__setstate__(("no error", "", 0, {'spam': 3})) 8457db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.__setstate__, ("", "f", 0, None)) 8467db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.__setstate__, ("", "", -1, None)) 8477db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__setstate__, (b"", "", 0, None)) 8487db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__setstate__, ("", b"", 0, None)) 8497db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__setstate__, ("", "", 0.0, None)) 8507db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__setstate__, ("", "", 0, 0)) 8517db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__setstate__, ("len-test", 0)) 8527db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__setstate__) 8537db96d56Sopenharmony_ci self.assertRaises(TypeError, memio.__setstate__, 0) 8547db96d56Sopenharmony_ci memio.close() 8557db96d56Sopenharmony_ci self.assertRaises(ValueError, memio.__setstate__, ("closed", "", 0, None)) 8567db96d56Sopenharmony_ci 8577db96d56Sopenharmony_ci 8587db96d56Sopenharmony_ciclass CStringIOPickleTest(PyStringIOPickleTest): 8597db96d56Sopenharmony_ci UnsupportedOperation = io.UnsupportedOperation 8607db96d56Sopenharmony_ci 8617db96d56Sopenharmony_ci class ioclass(io.StringIO): 8627db96d56Sopenharmony_ci def __new__(cls, *args, **kwargs): 8637db96d56Sopenharmony_ci return pickle.loads(pickle.dumps(io.StringIO(*args, **kwargs))) 8647db96d56Sopenharmony_ci def __init__(self, *args, **kwargs): 8657db96d56Sopenharmony_ci pass 8667db96d56Sopenharmony_ci 8677db96d56Sopenharmony_ci 8687db96d56Sopenharmony_ciif __name__ == '__main__': 8697db96d56Sopenharmony_ci unittest.main() 870