@@ -301,7 +301,7 @@ describe('Listbox Pattern', () => {
301
301
expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Apple' ] ) ;
302
302
} ) ;
303
303
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)' , ( ) => {
305
305
listbox . onKeydown ( down ( ) ) ;
306
306
listbox . onKeydown ( space ( ) ) ; // Apricot
307
307
listbox . onKeydown ( down ( ) ) ;
@@ -310,12 +310,31 @@ describe('Listbox Pattern', () => {
310
310
expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Apricot' , 'Banana' , 'Blackberry' ] ) ;
311
311
} ) ;
312
312
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
+
313
332
it ( 'should select the focused option and all options up to the first option on Ctrl + Shift + Home' , ( ) => {
314
333
listbox . onKeydown ( down ( ) ) ;
315
334
listbox . onKeydown ( down ( ) ) ;
316
335
listbox . onKeydown ( down ( ) ) ;
317
336
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 ' ] ) ;
319
338
} ) ;
320
339
321
340
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', () => {
414
433
expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Apple' ] ) ;
415
434
} ) ;
416
435
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)' , ( ) => {
418
445
listbox . onKeydown ( down ( { control : true } ) ) ;
419
446
listbox . onKeydown ( down ( { control : true } ) ) ;
420
- listbox . onKeydown ( down ( ) ) ; // Blackberry
447
+ listbox . onKeydown ( space ( ) ) ;
448
+ expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' ] ) ;
449
+
421
450
listbox . onKeydown ( down ( { control : true } ) ) ;
422
451
listbox . onKeydown ( down ( { control : true } ) ) ;
423
452
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' ] ) ;
425
461
} ) ;
426
462
427
463
it ( 'should select the focused option and all options up to the first option on Ctrl + Shift + Home' , ( ) => {
428
464
listbox . onKeydown ( down ( { control : true } ) ) ;
429
465
listbox . onKeydown ( down ( { control : true } ) ) ;
430
466
listbox . onKeydown ( down ( ) ) ;
431
467
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 ' ] ) ;
433
469
} ) ;
434
470
435
471
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', () => {
528
564
expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Blackberry' , 'Blueberry' , 'Cantaloupe' ] ) ;
529
565
} ) ;
530
566
531
- it ( 'should deselect options from anchor on shift + click ' , ( ) => {
567
+ it ( 'should deselect options outside the range on subsequent shift + clicks ' , ( ) => {
532
568
const { listbox, options} = getDefaultPatterns ( {
533
569
multi : signal ( true ) ,
534
570
selectionMode : signal ( 'explicit' ) ,
535
571
} ) ;
536
572
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' ] ) ;
540
577
} ) ;
541
578
} ) ;
542
579
@@ -578,7 +615,7 @@ describe('Listbox Pattern', () => {
578
615
expect ( listbox . inputs . value ( ) ) . toEqual ( [ ] ) ;
579
616
} ) ;
580
617
581
- it ( 'should select options from anchor on shift + click' , ( ) => {
618
+ it ( 'should select a range of options on shift + click' , ( ) => {
582
619
const { listbox, options} = getDefaultPatterns ( {
583
620
multi : signal ( true ) ,
584
621
selectionMode : signal ( 'follow' ) ,
@@ -588,15 +625,16 @@ describe('Listbox Pattern', () => {
588
625
expect ( listbox . inputs . value ( ) ) . toEqual ( [ 'Banana' , 'Blackberry' , 'Blueberry' , 'Cantaloupe' ] ) ;
589
626
} ) ;
590
627
591
- it ( 'should deselect options from anchor on shift + click ' , ( ) => {
628
+ it ( 'should deselect options outside the range on subsequent shift + clicks ' , ( ) => {
592
629
const { listbox, options} = getDefaultPatterns ( {
593
630
multi : signal ( true ) ,
594
631
selectionMode : signal ( 'follow' ) ,
595
632
} ) ;
596
633
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' ] ) ;
600
638
} ) ;
601
639
} ) ;
602
640
@@ -609,5 +647,16 @@ describe('Listbox Pattern', () => {
609
647
listbox . onPointerdown ( click ( options , 2 ) ) ;
610
648
expect ( listbox . inputs . value ( ) ) . toEqual ( [ ] ) ;
611
649
} ) ;
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
+ } ) ;
612
661
} ) ;
613
662
} ) ;
0 commit comments