File tree Expand file tree Collapse file tree 2 files changed +32
-1
lines changed Expand file tree Collapse file tree 2 files changed +32
-1
lines changed Original file line number Diff line number Diff line change @@ -122,7 +122,14 @@ impl Grid {
122122 self . scrollback
123123 . iter ( )
124124 . skip ( scrollback_len - self . scrollback_offset )
125- . chain ( self . rows . iter ( ) . take ( rows_len - self . scrollback_offset ) )
125+ // when scrollback_offset > rows_len (e.g. rows = 3,
126+ // scrollback_len = 10, offset = 9) the skip(10 - 9)
127+ // will take 9 rows instead of 3. we need to set
128+ // the upper bound to rows_len (e.g. 3)
129+ . take ( rows_len)
130+ // same for rows_len - scrollback_offset (e.g. 3 - 9).
131+ // it'll panic with overflow. we have to saturate the subtraction.
132+ . chain ( self . rows . iter ( ) . take ( rows_len. saturating_sub ( self . scrollback_offset ) ) )
126133 }
127134
128135 pub fn drawing_rows ( & self ) -> impl Iterator < Item = & crate :: row:: Row > {
Original file line number Diff line number Diff line change 1+ use std:: ops:: RangeInclusive ;
2+
13mod helpers;
24
35#[ test]
@@ -110,3 +112,25 @@ fn edge_of_screen() {
110112 b"\x1b [24;75H\x1b [31mfoobar\x1b [24;80H"
111113 ) ;
112114}
115+
116+ #[ test]
117+ fn scrollback_larger_than_rows ( ) {
118+ let mut parser = vt100:: Parser :: new ( 3 , 20 , 10 ) ;
119+
120+ parser. process ( & gen_nums ( 1 ..=10 , "\r \n " ) . as_bytes ( ) ) ;
121+
122+ // 1. Extra rows returned
123+ parser. screen_mut ( ) . set_scrollback ( 4 ) ;
124+ assert_eq ! ( parser. screen( ) . contents( ) , gen_nums( 4 ..=6 , "\n " ) ) ;
125+
126+ // 2. Subtraction overflow
127+ parser. screen_mut ( ) . set_scrollback ( 10 ) ;
128+ assert_eq ! ( parser. screen( ) . contents( ) , gen_nums( 1 ..=4 , "\n " ) ) ;
129+ }
130+
131+ #[ cfg( test) ]
132+ fn gen_nums ( range : RangeInclusive < u8 > , join : & str ) -> String {
133+ range. map ( |num| num. to_string ( ) )
134+ . collect :: < Vec < String > > ( )
135+ . join ( join)
136+ }
You can’t perform that action at this time.
0 commit comments