@@ -2429,62 +2429,111 @@ describe('InputHandler', () => {
24292429 }
24302430 } ) ;
24312431 } ) ;
2432- } ) ;
24332432
2433+ describe ( 'InputHandler - kitty keyboard' , ( ) => {
2434+ let bufferService : IBufferService ;
2435+ let coreService : ICoreService ;
2436+ let optionsService : MockOptionsService ;
2437+ let inputHandler : TestInputHandler ;
24342438
2435- describe ( 'InputHandler - async handlers' , ( ) => {
2436- let bufferService : IBufferService ;
2437- let coreService : ICoreService ;
2438- let optionsService : MockOptionsService ;
2439- let inputHandler : TestInputHandler ;
2439+ beforeEach ( ( ) => {
2440+ optionsService = new MockOptionsService ( { vtExtensions : { kittyKeyboard : true } } ) ;
2441+ bufferService = new BufferService ( optionsService ) ;
2442+ bufferService . resize ( 80 , 30 ) ;
2443+ coreService = new CoreService ( bufferService , new MockLogService ( ) , optionsService ) ;
2444+ inputHandler = new TestInputHandler ( bufferService , new MockCharsetService ( ) , coreService , new MockLogService ( ) , optionsService , new MockOscLinkService ( ) , new MockCoreMouseService ( ) , new MockUnicodeService ( ) ) ;
2445+ } ) ;
24402446
2441- beforeEach ( ( ) => {
2442- optionsService = new MockOptionsService ( ) ;
2443- bufferService = new BufferService ( optionsService ) ;
2444- bufferService . resize ( 80 , 30 ) ;
2445- coreService = new CoreService ( bufferService , new MockLogService ( ) , optionsService ) ;
2446- coreService . onData ( data => { console . log ( data ) ; } ) ;
2447+ describe ( 'stack limit' , ( ) => {
2448+ it ( 'should evict oldest entry when stack exceeds 16 entries' , async ( ) => {
2449+ for ( let i = 1 ; i <= 20 ; i ++ ) {
2450+ await inputHandler . parseP ( `\x1b[>${ i } u` ) ;
2451+ }
2452+ assert . strictEqual ( coreService . kittyKeyboard . mainStack . length , 16 ) ;
2453+ assert . strictEqual ( coreService . kittyKeyboard . mainStack [ 0 ] , 4 ) ;
2454+ } ) ;
2455+ } ) ;
24472456
2448- inputHandler = new TestInputHandler ( bufferService , new MockCharsetService ( ) , coreService , new MockLogService ( ) , optionsService , new MockOscLinkService ( ) , new MockCoreMouseService ( ) , new MockUnicodeService ( ) ) ;
2449- } ) ;
2457+ describe ( 'buffer switch' , ( ) => {
2458+ it ( 'should maintain separate flags for main and alt screens' , async ( ) => {
2459+ await inputHandler . parseP ( '\x1b[>5u' ) ;
2460+ assert . strictEqual ( coreService . kittyKeyboard . flags , 5 ) ;
2461+ await inputHandler . parseP ( '\x1b[?1049h' ) ;
2462+ assert . strictEqual ( coreService . kittyKeyboard . flags , 0 ) ;
2463+ assert . strictEqual ( coreService . kittyKeyboard . mainFlags , 5 ) ;
2464+ await inputHandler . parseP ( '\x1b[>7u' ) ;
2465+ assert . strictEqual ( coreService . kittyKeyboard . flags , 7 ) ;
2466+ await inputHandler . parseP ( '\x1b[?1049l' ) ;
2467+ assert . strictEqual ( coreService . kittyKeyboard . flags , 5 ) ;
2468+ assert . strictEqual ( coreService . kittyKeyboard . altFlags , 7 ) ;
2469+ } ) ;
2470+ } ) ;
24502471
2451- it ( 'async CUP with CPR check' , async ( ) => {
2452- const cup : number [ ] [ ] = [ ] ;
2453- const cpr : number [ ] [ ] = [ ] ;
2454- inputHandler . registerCsiHandler ( { final : 'H' } , async params => {
2455- cup . push ( params . toArray ( ) as number [ ] ) ;
2456- await new Promise ( res => setTimeout ( res , 50 ) ) ;
2457- // late call of real repositioning
2458- return inputHandler . cursorPosition ( params ) ;
2459- } ) ;
2460- coreService . onData ( data => {
2461- const m = data . match ( / \x1b \[ ( .* ?) ; ( .* ?) R / ) ;
2462- if ( m ) {
2463- cpr . push ( [ parseInt ( m [ 1 ] ) , parseInt ( m [ 2 ] ) ] ) ;
2464- }
2472+ describe ( 'pop reset' , ( ) => {
2473+ it ( 'should reset flags to 0 when stack is emptied' , async ( ) => {
2474+ await inputHandler . parseP ( '\x1b[>5u' ) ;
2475+ assert . strictEqual ( coreService . kittyKeyboard . flags , 5 ) ;
2476+ await inputHandler . parseP ( '\x1b[<10u' ) ;
2477+ assert . strictEqual ( coreService . kittyKeyboard . flags , 0 ) ;
2478+ } ) ;
24652479 } ) ;
2466- await inputHandler . parseP ( 'aaa\x1b[3;4H\x1b[6nbbb\x1b[6;8H\x1b[6n' ) ;
2467- assert . deepEqual ( cup , cpr ) ;
24682480 } ) ;
2469- it ( 'async OSC between' , async ( ) => {
2470- inputHandler . registerOscHandler ( 1000 , async data => {
2471- await new Promise ( res => setTimeout ( res , 50 ) ) ;
2472- assert . deepEqual ( getLines ( bufferService , 2 ) , [ 'hello world!' , '' ] ) ;
2473- assert . equal ( data , 'some data' ) ;
2474- return true ;
2475- } ) ;
2476- await inputHandler . parseP ( 'hello world!\r\n\x1b]1000;some data\x07second line' ) ;
2477- assert . deepEqual ( getLines ( bufferService , 2 ) , [ 'hello world!' , 'second line' ] ) ;
2478- } ) ;
2479- it ( 'async DCS between' , async ( ) => {
2480- inputHandler . registerDcsHandler ( { final : 'a' } , async ( data , params ) => {
2481- await new Promise ( res => setTimeout ( res , 50 ) ) ;
2482- assert . deepEqual ( getLines ( bufferService , 2 ) , [ 'hello world!' , '' ] ) ;
2483- assert . equal ( data , 'some data' ) ;
2484- assert . deepEqual ( params . toArray ( ) , [ 1 , 2 ] ) ;
2485- return true ;
2486- } ) ;
2487- await inputHandler . parseP ( 'hello world!\r\n\x1bP1;2asome data\x1b\\second line' ) ;
2488- assert . deepEqual ( getLines ( bufferService , 2 ) , [ 'hello world!' , 'second line' ] ) ;
2481+
2482+
2483+ describe ( 'InputHandler - async handlers' , ( ) => {
2484+ let bufferService : IBufferService ;
2485+ let coreService : ICoreService ;
2486+ let optionsService : MockOptionsService ;
2487+ let inputHandler : TestInputHandler ;
2488+
2489+ beforeEach ( ( ) => {
2490+ optionsService = new MockOptionsService ( ) ;
2491+ bufferService = new BufferService ( optionsService ) ;
2492+ bufferService . resize ( 80 , 30 ) ;
2493+ coreService = new CoreService ( bufferService , new MockLogService ( ) , optionsService ) ;
2494+ coreService . onData ( data => { console . log ( data ) ; } ) ;
2495+
2496+ inputHandler = new TestInputHandler ( bufferService , new MockCharsetService ( ) , coreService , new MockLogService ( ) , optionsService , new MockOscLinkService ( ) , new MockCoreMouseService ( ) , new MockUnicodeService ( ) ) ;
2497+ } ) ;
2498+
2499+ it ( 'async CUP with CPR check' , async ( ) => {
2500+ const cup : number [ ] [ ] = [ ] ;
2501+ const cpr : number [ ] [ ] = [ ] ;
2502+ inputHandler . registerCsiHandler ( { final : 'H' } , async params => {
2503+ cup . push ( params . toArray ( ) as number [ ] ) ;
2504+ await new Promise ( res => setTimeout ( res , 50 ) ) ;
2505+ // late call of real repositioning
2506+ return inputHandler . cursorPosition ( params ) ;
2507+ } ) ;
2508+ coreService . onData ( data => {
2509+ const m = data . match ( / \x1b \[ ( .* ?) ; ( .* ?) R / ) ;
2510+ if ( m ) {
2511+ cpr . push ( [ parseInt ( m [ 1 ] ) , parseInt ( m [ 2 ] ) ] ) ;
2512+ }
2513+ } ) ;
2514+ await inputHandler . parseP ( 'aaa\x1b[3;4H\x1b[6nbbb\x1b[6;8H\x1b[6n' ) ;
2515+ assert . deepEqual ( cup , cpr ) ;
2516+ } ) ;
2517+ it ( 'async OSC between' , async ( ) => {
2518+ inputHandler . registerOscHandler ( 1000 , async data => {
2519+ await new Promise ( res => setTimeout ( res , 50 ) ) ;
2520+ assert . deepEqual ( getLines ( bufferService , 2 ) , [ 'hello world!' , '' ] ) ;
2521+ assert . equal ( data , 'some data' ) ;
2522+ return true ;
2523+ } ) ;
2524+ await inputHandler . parseP ( 'hello world!\r\n\x1b]1000;some data\x07second line' ) ;
2525+ assert . deepEqual ( getLines ( bufferService , 2 ) , [ 'hello world!' , 'second line' ] ) ;
2526+ } ) ;
2527+ it ( 'async DCS between' , async ( ) => {
2528+ inputHandler . registerDcsHandler ( { final : 'a' } , async ( data , params ) => {
2529+ await new Promise ( res => setTimeout ( res , 50 ) ) ;
2530+ assert . deepEqual ( getLines ( bufferService , 2 ) , [ 'hello world!' , '' ] ) ;
2531+ assert . equal ( data , 'some data' ) ;
2532+ assert . deepEqual ( params . toArray ( ) , [ 1 , 2 ] ) ;
2533+ return true ;
2534+ } ) ;
2535+ await inputHandler . parseP ( 'hello world!\r\n\x1bP1;2asome data\x1b\\second line' ) ;
2536+ assert . deepEqual ( getLines ( bufferService , 2 ) , [ 'hello world!' , 'second line' ] ) ;
2537+ } ) ;
24892538 } ) ;
24902539} ) ;
0 commit comments