@@ -621,6 +621,59 @@ describe("WidgetRenderer integration battery", () => {
621621 assert . deepEqual ( values , [ ] ) ;
622622 } ) ;
623623
624+ test ( "select uses Enter and Space to advance like the inline cycler runtime" , ( ) => {
625+ const backend = createNoopBackend ( ) ;
626+ const renderer = new WidgetRenderer < void > ( {
627+ backend,
628+ requestRender : ( ) => { } ,
629+ } ) ;
630+
631+ let value = "dark" ;
632+ const values : string [ ] = [ ] ;
633+ const view = ( ) =>
634+ ui . select ( {
635+ id : "theme" ,
636+ value,
637+ options : [
638+ { value : "dark" , label : "Dark" } ,
639+ { value : "light" , label : "Light" } ,
640+ { value : "system" , label : "System" } ,
641+ ] ,
642+ onChange : ( nextValue ) => {
643+ value = nextValue ;
644+ values . push ( nextValue ) ;
645+ } ,
646+ } ) ;
647+
648+ let res = renderer . submitFrame (
649+ ( ) => view ( ) ,
650+ undefined ,
651+ { cols : 40 , rows : 5 } ,
652+ defaultTheme ,
653+ noRenderHooks ( ) ,
654+ ) ;
655+ assert . ok ( res . ok ) ;
656+
657+ renderer . routeEngineEvent ( keyEvent ( 3 /* TAB */ ) ) ;
658+ assert . equal ( renderer . getFocusedId ( ) , "theme" ) ;
659+
660+ renderer . routeEngineEvent ( keyEvent ( 2 /* ENTER */ ) ) ;
661+ assert . equal ( value , "light" ) ;
662+
663+ res = renderer . submitFrame (
664+ ( ) => view ( ) ,
665+ undefined ,
666+ { cols : 40 , rows : 5 } ,
667+ defaultTheme ,
668+ noRenderHooks ( ) ,
669+ ) ;
670+ assert . ok ( res . ok ) ;
671+
672+ renderer . routeEngineEvent ( keyEvent ( 32 /* SPACE */ ) ) ;
673+ assert . equal ( value , "system" ) ;
674+ assert . deepEqual ( values , [ "light" , "system" ] ) ;
675+ } ) ;
676+
624677 test ( "focusTrap wraps TAB within active trap" , ( ) => {
625678 const backend = createNoopBackend ( ) ;
626679 const renderer = new WidgetRenderer < void > ( {
0 commit comments