@@ -566,6 +566,77 @@ def test_issue141311(self):
566566 buf = bytearray (2 )
567567 self .assertEqual (0 , memio .readinto (buf ))
568568
569+ def test_peek (self ):
570+ buf = self .buftype ("1234567890" )
571+ with self .ioclass (buf ) as memio :
572+ self .assertEqual (memio .tell (), 0 )
573+ self .assertEqual (memio .peek (1 ), buf [:1 ])
574+ self .assertEqual (memio .peek (1 ), buf [:1 ])
575+ self .assertEqual (memio .peek (), buf )
576+ self .assertEqual (memio .peek (3 ), buf [:3 ])
577+ self .assertEqual (memio .peek (5 ), buf [:5 ])
578+ self .assertEqual (memio .peek (0 ), buf )
579+ self .assertEqual (memio .peek (len (buf ) + 100 ), buf )
580+ self .assertEqual (memio .peek (- 1 ), buf )
581+ self .assertEqual (memio .tell (), 0 )
582+
583+ memio .read (1 )
584+ self .assertEqual (memio .tell (), 1 )
585+ self .assertEqual (memio .peek (1 ), buf [1 :2 ])
586+ self .assertEqual (memio .peek (), buf [1 :])
587+ self .assertEqual (memio .peek (3 ), buf [1 :4 ])
588+ self .assertEqual (memio .peek (5 ), buf [1 :6 ])
589+ self .assertEqual (memio .peek (0 ), buf [1 :])
590+ self .assertEqual (memio .peek (len (buf ) + 100 ), buf [1 :])
591+ self .assertEqual (memio .peek (- 1 ), buf [1 :])
592+ self .assertEqual (memio .tell (), 1 )
593+
594+ memio .read ()
595+ self .assertEqual (memio .tell (), len (buf ))
596+ self .assertEqual (memio .peek (1 ), self .EOF )
597+ self .assertEqual (memio .peek (3 ), self .EOF )
598+ self .assertEqual (memio .peek (5 ), self .EOF )
599+ self .assertEqual (memio .peek (0 ), b"" )
600+ self .assertEqual (memio .tell (), len (buf ))
601+
602+ # Peeking works after writing
603+ abc = self .buftype ("abc" )
604+ memio .write (abc )
605+ self .assertEqual (memio .peek (), self .EOF )
606+ memio .seek (len (buf ))
607+ self .assertEqual (memio .peek (), abc )
608+ self .assertEqual (memio .peek (- 1 ), abc )
609+ self .assertEqual (memio .peek (len (abc ) + 100 ), abc )
610+ self .assertEqual (memio .tell (), len (buf ))
611+
612+ with self .ioclass (buf ) as memio :
613+ memio .seek (len (buf ))
614+ self .assertEqual (memio .peek (), self .EOF )
615+
616+ # Length greater than DEFAULT_BUFFER_SIZE
617+ buf = self .buftype ("1234567890" * io .DEFAULT_BUFFER_SIZE )
618+ with self .ioclass (buf ) as memio :
619+ self .assertEqual (memio .peek (), buf [:io .DEFAULT_BUFFER_SIZE ])
620+ self .assertEqual (memio .peek (0 ), buf [:io .DEFAULT_BUFFER_SIZE ])
621+ self .assertEqual (memio .peek (- 1 ), buf [:io .DEFAULT_BUFFER_SIZE ])
622+ self .assertEqual (memio .peek (io .DEFAULT_BUFFER_SIZE + 100 ),
623+ buf [:io .DEFAULT_BUFFER_SIZE + 100 ])
624+ self .assertEqual (memio .peek (io .DEFAULT_BUFFER_SIZE * 100 ), buf )
625+
626+ # Current position beyond buffer end
627+ with self .ioclass (buf ) as memio :
628+ memio .seek (len (buf ) + 100 )
629+ self .assertEqual (memio .peek (), self .EOF )
630+ with self .ioclass (buf ) as memio :
631+ memio .read ()
632+ memio .truncate (0 )
633+ self .assertEqual (memio .tell (), len (buf ))
634+ self .assertEqual (memio .peek (), self .EOF )
635+
636+
637+ # Peek after close raises
638+ self .assertRaises (ValueError , memio .peek )
639+
569640 def test_unicode (self ):
570641 memio = self .ioclass ()
571642
0 commit comments