@@ -1913,6 +1913,92 @@ describe('InputHandler', () => {
1913
1913
} ) ;
1914
1914
} ) ;
1915
1915
} ) ;
1916
+
1917
+ // issue #3362 and #2979
1918
+ describe ( 'EL/ED cursor at buffer.cols' , ( ) => {
1919
+ beforeEach ( ( ) => {
1920
+ bufferService . resize ( 10 , 5 ) ;
1921
+ } ) ;
1922
+ describe ( 'cursor should stay at cols / does not overflow' , ( ) => {
1923
+ it ( 'EL0' , async ( ) => {
1924
+ await inputHandler . parseP ( '##########\x1b[0K' ) ;
1925
+ assert . equal ( bufferService . buffer . x , 10 ) ;
1926
+ assert . deepEqual ( getLines ( bufferService ) , [ '#' . repeat ( 10 ) , '' , '' , '' , '' ] ) ;
1927
+ } ) ;
1928
+ it ( 'EL1' , async ( ) => {
1929
+ await inputHandler . parseP ( '##########\x1b[1K' ) ;
1930
+ assert . equal ( bufferService . buffer . x , 10 ) ;
1931
+ assert . deepEqual ( getLines ( bufferService ) , [ '' , '' , '' , '' , '' ] ) ;
1932
+ } ) ;
1933
+ it ( 'EL2' , async ( ) => {
1934
+ await inputHandler . parseP ( '##########\x1b[2K' ) ;
1935
+ assert . equal ( bufferService . buffer . x , 10 ) ;
1936
+ assert . deepEqual ( getLines ( bufferService ) , [ '' , '' , '' , '' , '' ] ) ;
1937
+ } ) ;
1938
+ it ( 'ED0' , async ( ) => {
1939
+ await inputHandler . parseP ( '##########\x1b[0J' ) ;
1940
+ assert . equal ( bufferService . buffer . x , 10 ) ;
1941
+ assert . deepEqual ( getLines ( bufferService ) , [ '#' . repeat ( 10 ) , '' , '' , '' , '' ] ) ;
1942
+ } ) ;
1943
+ it ( 'ED1' , async ( ) => {
1944
+ await inputHandler . parseP ( '##########\x1b[1J' ) ;
1945
+ assert . equal ( bufferService . buffer . x , 10 ) ;
1946
+ assert . deepEqual ( getLines ( bufferService ) , [ '' , '' , '' , '' , '' ] ) ;
1947
+ } ) ;
1948
+ it ( 'ED2' , async ( ) => {
1949
+ await inputHandler . parseP ( '##########\x1b[2J' ) ;
1950
+ assert . equal ( bufferService . buffer . x , 10 ) ;
1951
+ assert . deepEqual ( getLines ( bufferService ) , [ '' , '' , '' , '' , '' ] ) ;
1952
+ } ) ;
1953
+ it ( 'ED3' , async ( ) => {
1954
+ await inputHandler . parseP ( '##########\x1b[3J' ) ;
1955
+ assert . equal ( bufferService . buffer . x , 10 ) ;
1956
+ assert . deepEqual ( getLines ( bufferService ) , [ '#' . repeat ( 10 ) , '' , '' , '' , '' ] ) ;
1957
+ } ) ;
1958
+ } ) ;
1959
+ describe ( 'following sequence keeps working' , ( ) => {
1960
+ // sequences to test (cursor related ones)
1961
+ const SEQ = [
1962
+ /* ICH */ '\x1b[10@' ,
1963
+ /* SL */ '\x1b[10 @' ,
1964
+ /* CUU */ '\x1b[10A' ,
1965
+ /* SR */ '\x1b[10 A' ,
1966
+ /* CUD */ '\x1b[10B' ,
1967
+ /* CUF */ '\x1b[10C' ,
1968
+ /* CUB */ '\x1b[10D' ,
1969
+ /* CNL */ '\x1b[10E' ,
1970
+ /* CPL */ '\x1b[10F' ,
1971
+ /* CHA */ '\x1b[10G' ,
1972
+ /* CUP */ '\x1b[10;10H' ,
1973
+ /* CHT */ '\x1b[10I' ,
1974
+ /* IL */ '\x1b[10L' ,
1975
+ /* DL */ '\x1b[10M' ,
1976
+ /* DCH */ '\x1b[10P' ,
1977
+ /* SU */ '\x1b[10S' ,
1978
+ /* SD */ '\x1b[10T' ,
1979
+ /* ECH */ '\x1b[10X' ,
1980
+ /* CBT */ '\x1b[10Z' ,
1981
+ /* HPA */ '\x1b[10`' ,
1982
+ /* HPR */ '\x1b[10a' ,
1983
+ /* REP */ '\x1b[10b' ,
1984
+ /* VPA */ '\x1b[10d' ,
1985
+ /* VPR */ '\x1b[10e' ,
1986
+ /* HVP */ '\x1b[10;10f' ,
1987
+ /* TBC */ '\x1b[0g' ,
1988
+ /* SCOSC */ '\x1b[s' ,
1989
+ /* DECIC */ '\x1b[10\'}' ,
1990
+ /* DECDC */ '\x1b[10\'~'
1991
+ ] ;
1992
+ it ( 'cursor never advances beyond cols' , async ( ) => {
1993
+ for ( const seq of SEQ ) {
1994
+ await inputHandler . parseP ( '##########\x1b[2J' + seq ) ;
1995
+ assert . equal ( bufferService . buffer . x <= bufferService . cols , true ) ;
1996
+ inputHandler . reset ( ) ;
1997
+ bufferService . reset ( ) ;
1998
+ }
1999
+ } ) ;
2000
+ } ) ;
2001
+ } ) ;
1916
2002
} ) ;
1917
2003
1918
2004
0 commit comments