@@ -392,6 +392,40 @@ describe('getInputProps', () => {
392
392
expect ( getInput ( ) ) . toHaveValue ( 'california' )
393
393
} )
394
394
395
+ test ( 'on change should remove the highlightedIndex' , async ( ) => {
396
+ renderCombobox ( { initialHighlightedIndex : 2 } )
397
+
398
+ await changeInputValue ( 'california' )
399
+
400
+ expect ( getInput ( ) ) . toHaveAttribute ( 'aria-activedescendant' , '' )
401
+ } )
402
+
403
+ test ( 'on change should reset to defaultHighlightedIndex' , async ( ) => {
404
+ const defaultHighlightedIndex = 2
405
+ renderCombobox ( { defaultHighlightedIndex} )
406
+
407
+ await changeInputValue ( 'a' )
408
+
409
+ expect ( getInput ( ) ) . toHaveAttribute (
410
+ 'aria-activedescendant' ,
411
+ defaultIds . getItemId ( defaultHighlightedIndex ) ,
412
+ )
413
+
414
+ await keyDownOnInput ( '{ArrowDown}' )
415
+
416
+ expect ( getInput ( ) ) . toHaveAttribute (
417
+ 'aria-activedescendant' ,
418
+ defaultIds . getItemId ( defaultHighlightedIndex + 1 ) ,
419
+ )
420
+
421
+ await changeInputValue ( 'a' )
422
+
423
+ expect ( getInput ( ) ) . toHaveAttribute (
424
+ 'aria-activedescendant' ,
425
+ defaultIds . getItemId ( defaultHighlightedIndex ) ,
426
+ )
427
+ } )
428
+
395
429
describe ( 'on key down' , ( ) => {
396
430
describe ( 'arrow up' , ( ) => {
397
431
test ( 'it prevents the default event behavior' , ( ) => {
@@ -550,6 +584,61 @@ describe('getInputProps', () => {
550
584
)
551
585
} )
552
586
587
+ test ( 'with Alt selects highlighted item and resets to user defaults' , async ( ) => {
588
+ const defaultHighlightedIndex = 2
589
+ renderCombobox ( {
590
+ defaultHighlightedIndex,
591
+ defaultIsOpen : true ,
592
+ } )
593
+ const input = getInput ( )
594
+
595
+ await keyDownOnInput ( '{Alt>}{ArrowUp}{/Alt}' )
596
+
597
+ expect ( input ) . toHaveValue ( items [ defaultHighlightedIndex ] )
598
+ expect ( getItems ( ) ) . toHaveLength ( items . length )
599
+ expect ( input ) . toHaveAttribute (
600
+ 'aria-activedescendant' ,
601
+ defaultIds . getItemId ( defaultHighlightedIndex ) ,
602
+ )
603
+ } )
604
+
605
+ test ( 'with Alt closes the menu without resetting to user defaults if no item is highlighted' , async ( ) => {
606
+ const defaultHighlightedIndex = 2
607
+ const initialSelectedItem = items [ 0 ]
608
+ renderCombobox ( {
609
+ defaultHighlightedIndex,
610
+ defaultIsOpen : true ,
611
+ initialSelectedItem,
612
+ } )
613
+ const input = getInput ( )
614
+
615
+ await mouseMoveItemAtIndex ( defaultHighlightedIndex )
616
+ await mouseLeaveItemAtIndex ( defaultHighlightedIndex )
617
+ await keyDownOnInput ( '{Alt>}{ArrowUp}{/Alt}' )
618
+
619
+ expect ( input ) . toHaveValue ( initialSelectedItem )
620
+ expect ( getItems ( ) ) . toHaveLength ( 0 )
621
+ expect ( input ) . toHaveAttribute ( 'aria-activedescendant' , '' )
622
+ } )
623
+
624
+ test ( 'with Alt closes the menu without resetting to user defaults if lhe list is empty' , async ( ) => {
625
+ const defaultHighlightedIndex = 2
626
+ const initialSelectedItem = items [ 0 ]
627
+ renderCombobox ( {
628
+ defaultHighlightedIndex,
629
+ defaultIsOpen : true ,
630
+ initialSelectedItem,
631
+ items : [ ] ,
632
+ } )
633
+ const input = getInput ( )
634
+
635
+ await keyDownOnInput ( '{Alt>}{ArrowUp}{/Alt}' )
636
+
637
+ expect ( input ) . toHaveValue ( initialSelectedItem )
638
+ expect ( getItems ( ) ) . toHaveLength ( 0 )
639
+ expect ( input ) . toHaveAttribute ( 'aria-activedescendant' , '' )
640
+ } )
641
+
553
642
test ( 'will continue from 0 to last item' , async ( ) => {
554
643
renderCombobox ( {
555
644
isOpen : true ,
@@ -848,7 +937,7 @@ describe('getInputProps', () => {
848
937
849
938
await keyDownOnInput ( '{Escape}' ) // focus input and close the menu.
850
939
renderSpy . mockClear ( )
851
-
940
+
852
941
await keyDownOnInput ( '{Escape}' )
853
942
854
943
expect ( renderSpy ) . toHaveBeenCalledTimes ( 0 ) // no re-render
@@ -917,6 +1006,43 @@ describe('getInputProps', () => {
917
1006
)
918
1007
} )
919
1008
1009
+ test ( 'enter closes the menu without resetting to user defaults if no item is highlighted' , async ( ) => {
1010
+ const defaultHighlightedIndex = 2
1011
+ const initialSelectedItem = items [ 0 ]
1012
+ renderCombobox ( {
1013
+ defaultHighlightedIndex,
1014
+ defaultIsOpen : true ,
1015
+ initialSelectedItem,
1016
+ } )
1017
+ const input = getInput ( )
1018
+
1019
+ await mouseMoveItemAtIndex ( defaultHighlightedIndex )
1020
+ await mouseLeaveItemAtIndex ( defaultHighlightedIndex )
1021
+ await keyDownOnInput ( '{Enter}' )
1022
+
1023
+ expect ( input ) . toHaveValue ( initialSelectedItem )
1024
+ expect ( getItems ( ) ) . toHaveLength ( 0 )
1025
+ expect ( input ) . toHaveAttribute ( 'aria-activedescendant' , '' )
1026
+ } )
1027
+
1028
+ test ( 'enter closes the menu without resetting to user defaults if the list is empty' , async ( ) => {
1029
+ const defaultHighlightedIndex = 2
1030
+ const initialSelectedItem = items [ 0 ]
1031
+ renderCombobox ( {
1032
+ defaultHighlightedIndex,
1033
+ defaultIsOpen : true ,
1034
+ initialSelectedItem,
1035
+ items : [ ] ,
1036
+ } )
1037
+ const input = getInput ( )
1038
+
1039
+ await keyDownOnInput ( '{Enter}' )
1040
+
1041
+ expect ( input ) . toHaveValue ( initialSelectedItem )
1042
+ expect ( getItems ( ) ) . toHaveLength ( 0 )
1043
+ expect ( input ) . toHaveAttribute ( 'aria-activedescendant' , '' )
1044
+ } )
1045
+
920
1046
test ( 'enter while IME composing will not select highlighted item' , async ( ) => {
921
1047
const initialHighlightedIndex = 2
922
1048
renderCombobox ( {
@@ -1016,6 +1142,61 @@ describe('getInputProps', () => {
1016
1142
expect ( getInput ( ) ) . toHaveValue ( items [ initialHighlightedIndex ] )
1017
1143
} )
1018
1144
1145
+ test ( 'tab closes the menu if there is no highlighted item' , async ( ) => {
1146
+ const defaultHighlightedIndex = 2
1147
+ const initialSelectedItem = items [ 0 ]
1148
+
1149
+ renderCombobox (
1150
+ {
1151
+ defaultHighlightedIndex,
1152
+ defaultIsOpen : true ,
1153
+ initialSelectedItem,
1154
+ } ,
1155
+ ui => {
1156
+ return (
1157
+ < >
1158
+ { ui }
1159
+ < div tabIndex = { 0 } > Second element</ div >
1160
+ </ >
1161
+ )
1162
+ } ,
1163
+ )
1164
+
1165
+ await mouseMoveItemAtIndex ( defaultHighlightedIndex )
1166
+ await mouseLeaveItemAtIndex ( defaultHighlightedIndex )
1167
+ await tab ( )
1168
+
1169
+ expect ( getItems ( ) ) . toHaveLength ( 0 )
1170
+ expect ( getInput ( ) ) . toHaveValue ( initialSelectedItem )
1171
+ } )
1172
+
1173
+ test ( 'tab closes the menu if there is no items' , async ( ) => {
1174
+ const defaultHighlightedIndex = 2
1175
+ const initialSelectedItem = items [ 0 ]
1176
+
1177
+ renderCombobox (
1178
+ {
1179
+ defaultHighlightedIndex,
1180
+ defaultIsOpen : true ,
1181
+ initialSelectedItem,
1182
+ items : [ ] ,
1183
+ } ,
1184
+ ui => {
1185
+ return (
1186
+ < >
1187
+ { ui }
1188
+ < div tabIndex = { 0 } > Second element</ div >
1189
+ </ >
1190
+ )
1191
+ } ,
1192
+ )
1193
+
1194
+ await tab ( )
1195
+
1196
+ expect ( getItems ( ) ) . toHaveLength ( 0 )
1197
+ expect ( getInput ( ) ) . toHaveValue ( initialSelectedItem )
1198
+ } )
1199
+
1019
1200
test ( 'shift+tab it closes the menu' , async ( ) => {
1020
1201
const initialHighlightedIndex = 2
1021
1202
renderCombobox (
0 commit comments