@@ -301,7 +301,7 @@ describe('Listbox Pattern', () => {
301301 expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Apple' ] ) ;
302302 } ) ;
303303
304- it ( 'should select contiguous items from the most recently selected item to the focused item on Shift + Space (or Enter)' , ( ) => {
304+ it ( 'should select a range of options on Shift + Space (or Enter)' , ( ) => {
305305 listbox . onKeydown ( down ( ) ) ;
306306 listbox . onKeydown ( space ( ) ) ; // Apricot
307307 listbox . onKeydown ( down ( ) ) ;
@@ -310,12 +310,31 @@ describe('Listbox Pattern', () => {
310310 expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Apricot' , 'Banana' , 'Blackberry' ] ) ;
311311 } ) ;
312312
313+ it ( 'should deselect options outside the range on subsequent on Shift + Space (or Enter)' , ( ) => {
314+ listbox . onKeydown ( down ( ) ) ;
315+ listbox . onKeydown ( down ( ) ) ;
316+ listbox . onKeydown ( space ( ) ) ;
317+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' ] ) ;
318+
319+ listbox . onKeydown ( down ( ) ) ;
320+ listbox . onKeydown ( down ( ) ) ;
321+ listbox . onKeydown ( space ( { shift : true } ) ) ;
322+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Blackberry' , 'Blueberry' ] ) ;
323+
324+ listbox . onKeydown ( up ( ) ) ;
325+ listbox . onKeydown ( up ( ) ) ;
326+ listbox . onKeydown ( up ( ) ) ;
327+ listbox . onKeydown ( up ( ) ) ;
328+ listbox . onKeydown ( space ( { shift : true } ) ) ;
329+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Apricot' , 'Apple' ] ) ;
330+ } ) ;
331+
313332 it ( 'should select the focused option and all options up to the first option on Ctrl + Shift + Home' , ( ) => {
314333 listbox . onKeydown ( down ( ) ) ;
315334 listbox . onKeydown ( down ( ) ) ;
316335 listbox . onKeydown ( down ( ) ) ;
317336 listbox . onKeydown ( home ( { control : true , shift : true } ) ) ;
318- expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Apple ' , 'Apricot ' , 'Banana ' , 'Blackberry ' ] ) ;
337+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Blackberry ' , 'Banana ' , 'Apricot ' , 'Apple ' ] ) ;
319338 } ) ;
320339
321340 it ( 'should select the focused option and all options down to the last option on Ctrl + Shift + End' , ( ) => {
@@ -414,22 +433,39 @@ describe('Listbox Pattern', () => {
414433 expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Apple' ] ) ;
415434 } ) ;
416435
417- it ( 'should select contiguous items from the most recently selected item to the focused item on Shift + Space (or Enter)' , ( ) => {
436+ it ( 'should select a range of options on Shift + Space (or Enter)' , ( ) => {
437+ listbox . onKeydown ( down ( ) ) ;
438+ listbox . onKeydown ( down ( { control : true } ) ) ;
439+ listbox . onKeydown ( down ( { control : true } ) ) ;
440+ listbox . onKeydown ( space ( { shift : true } ) ) ;
441+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Apricot' , 'Banana' , 'Blackberry' ] ) ;
442+ } ) ;
443+
444+ it ( 'should deselect options outside the range on subsequent on Shift + Space (or Enter)' , ( ) => {
418445 listbox . onKeydown ( down ( { control : true } ) ) ;
419446 listbox . onKeydown ( down ( { control : true } ) ) ;
420- listbox . onKeydown ( down ( ) ) ; // Blackberry
447+ listbox . onKeydown ( space ( ) ) ;
448+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' ] ) ;
449+
421450 listbox . onKeydown ( down ( { control : true } ) ) ;
422451 listbox . onKeydown ( down ( { control : true } ) ) ;
423452 listbox . onKeydown ( space ( { shift : true } ) ) ;
424- expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Blackberry' , 'Blueberry' , 'Cantaloupe' ] ) ;
453+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Blackberry' , 'Blueberry' ] ) ;
454+
455+ listbox . onKeydown ( up ( { control : true } ) ) ;
456+ listbox . onKeydown ( up ( { control : true } ) ) ;
457+ listbox . onKeydown ( up ( { control : true } ) ) ;
458+ listbox . onKeydown ( up ( { control : true } ) ) ;
459+ listbox . onKeydown ( space ( { shift : true } ) ) ;
460+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Apricot' , 'Apple' ] ) ;
425461 } ) ;
426462
427463 it ( 'should select the focused option and all options up to the first option on Ctrl + Shift + Home' , ( ) => {
428464 listbox . onKeydown ( down ( { control : true } ) ) ;
429465 listbox . onKeydown ( down ( { control : true } ) ) ;
430466 listbox . onKeydown ( down ( ) ) ;
431467 listbox . onKeydown ( home ( { control : true , shift : true } ) ) ;
432- expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Blackberry' , 'Apple ' , 'Apricot' , 'Banana ' ] ) ;
468+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Blackberry' , 'Banana ' , 'Apricot' , 'Apple ' ] ) ;
433469 } ) ;
434470
435471 it ( 'should select the focused option and all options down to the last option on Ctrl + Shift + End' , ( ) => {
@@ -528,15 +564,16 @@ describe('Listbox Pattern', () => {
528564 expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Blackberry' , 'Blueberry' , 'Cantaloupe' ] ) ;
529565 } ) ;
530566
531- it ( 'should deselect options from anchor on shift + click ' , ( ) => {
567+ it ( 'should deselect options outside the range on subsequent shift + clicks ' , ( ) => {
532568 const { listbox, options} = getDefaultPatterns ( {
533569 multi : signal ( true ) ,
534570 selectionMode : signal ( 'explicit' ) ,
535571 } ) ;
536572 listbox . onPointerdown ( click ( options , 2 ) ) ;
537- listbox . onPointerdown ( click ( options , 5 ) ) ;
538- listbox . onPointerdown ( click ( options , 2 , { shift : true } ) ) ;
539- expect ( listbox . inputs . value ( ) ) . toEqual ( [ ] ) ;
573+ listbox . onPointerdown ( click ( options , 5 , { shift : true } ) ) ;
574+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Blackberry' , 'Blueberry' , 'Cantaloupe' ] ) ;
575+ listbox . onPointerdown ( click ( options , 0 , { shift : true } ) ) ;
576+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Apricot' , 'Apple' ] ) ;
540577 } ) ;
541578 } ) ;
542579
@@ -578,7 +615,7 @@ describe('Listbox Pattern', () => {
578615 expect ( listbox . inputs . value ( ) ) . toEqual ( [ ] ) ;
579616 } ) ;
580617
581- it ( 'should select options from anchor on shift + click' , ( ) => {
618+ it ( 'should select a range of options on shift + click' , ( ) => {
582619 const { listbox, options} = getDefaultPatterns ( {
583620 multi : signal ( true ) ,
584621 selectionMode : signal ( 'follow' ) ,
@@ -588,15 +625,16 @@ describe('Listbox Pattern', () => {
588625 expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Blackberry' , 'Blueberry' , 'Cantaloupe' ] ) ;
589626 } ) ;
590627
591- it ( 'should deselect options from anchor on shift + click ' , ( ) => {
628+ it ( 'should deselect options outside the range on subsequent shift + clicks ' , ( ) => {
592629 const { listbox, options} = getDefaultPatterns ( {
593630 multi : signal ( true ) ,
594631 selectionMode : signal ( 'follow' ) ,
595632 } ) ;
596633 listbox . onPointerdown ( click ( options , 2 ) ) ;
597- listbox . onPointerdown ( click ( options , 5 , { control : true } ) ) ;
598- listbox . onPointerdown ( click ( options , 2 , { shift : true } ) ) ;
599- expect ( listbox . inputs . value ( ) ) . toEqual ( [ ] ) ;
634+ listbox . onPointerdown ( click ( options , 5 , { shift : true } ) ) ;
635+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Blackberry' , 'Blueberry' , 'Cantaloupe' ] ) ;
636+ listbox . onPointerdown ( click ( options , 0 , { shift : true } ) ) ;
637+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Apricot' , 'Apple' ] ) ;
600638 } ) ;
601639 } ) ;
602640
@@ -609,5 +647,16 @@ describe('Listbox Pattern', () => {
609647 listbox . onPointerdown ( click ( options , 2 ) ) ;
610648 expect ( listbox . inputs . value ( ) ) . toEqual ( [ ] ) ;
611649 } ) ;
650+
651+ it ( 'should maintain the range selection between pointer and keyboard' , ( ) => {
652+ const { listbox, options} = getDefaultPatterns ( { multi : signal ( true ) } ) ;
653+ listbox . onPointerdown ( click ( options , 2 ) ) ;
654+ listbox . onKeydown ( down ( ) ) ;
655+ listbox . onKeydown ( down ( ) ) ;
656+ listbox . onKeydown ( space ( { shift : true } ) ) ;
657+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Blackberry' , 'Blueberry' ] ) ;
658+ listbox . onPointerdown ( click ( options , 0 , { shift : true } ) ) ;
659+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Apricot' , 'Apple' ] ) ;
660+ } ) ;
612661 } ) ;
613662} ) ;
0 commit comments