@@ -437,3 +437,146 @@ impl App<'_> {
437437 }
438438 }
439439}
440+
441+ #[ cfg( test) ]
442+ mod tests {
443+ use super :: * ;
444+
445+ // Helper function to test numeric prefix parsing logic
446+ fn test_process_numeric_prefix_logic (
447+ numeric_prefix : & str ,
448+ user_event : UserEvent ,
449+ ) -> Option < UserEventWithCount > {
450+ let count = if numeric_prefix. is_empty ( ) {
451+ 1
452+ } else {
453+ numeric_prefix. parse :: < usize > ( ) . unwrap_or ( 1 )
454+ } ;
455+
456+ match user_event {
457+ UserEvent :: NavigateUp | UserEvent :: NavigateDown | UserEvent :: NavigateLeft | UserEvent :: NavigateRight |
458+ UserEvent :: ScrollUp | UserEvent :: ScrollDown | UserEvent :: PageUp | UserEvent :: PageDown |
459+ UserEvent :: HalfPageUp | UserEvent :: HalfPageDown => {
460+ Some ( UserEventWithCount :: new ( user_event, count) )
461+ }
462+ _ => {
463+ if numeric_prefix. is_empty ( ) {
464+ Some ( UserEventWithCount :: new ( user_event, 1 ) )
465+ } else {
466+ None
467+ }
468+ }
469+ }
470+ }
471+
472+ #[ test]
473+ fn test_process_numeric_prefix_no_prefix ( ) {
474+ let result = test_process_numeric_prefix_logic ( "" , UserEvent :: NavigateDown ) ;
475+
476+ assert ! ( result. is_some( ) ) ;
477+ let event_with_count = result. unwrap ( ) ;
478+ assert_eq ! ( event_with_count. event, UserEvent :: NavigateDown ) ;
479+ assert_eq ! ( event_with_count. count, 1 ) ;
480+ }
481+
482+ #[ test]
483+ fn test_process_numeric_prefix_with_prefix ( ) {
484+ let result = test_process_numeric_prefix_logic ( "5" , UserEvent :: NavigateDown ) ;
485+
486+ assert ! ( result. is_some( ) ) ;
487+ let event_with_count = result. unwrap ( ) ;
488+ assert_eq ! ( event_with_count. event, UserEvent :: NavigateDown ) ;
489+ assert_eq ! ( event_with_count. count, 5 ) ;
490+ }
491+
492+ #[ test]
493+ fn test_process_numeric_prefix_invalid_number ( ) {
494+ let result = test_process_numeric_prefix_logic ( "abc" , UserEvent :: NavigateDown ) ;
495+
496+ assert ! ( result. is_some( ) ) ;
497+ let event_with_count = result. unwrap ( ) ;
498+ assert_eq ! ( event_with_count. event, UserEvent :: NavigateDown ) ;
499+ assert_eq ! ( event_with_count. count, 1 ) ; // Should fallback to 1
500+ }
501+
502+ #[ test]
503+ fn test_process_numeric_prefix_countable_events ( ) {
504+ let countable_events = [
505+ UserEvent :: NavigateUp ,
506+ UserEvent :: NavigateDown ,
507+ UserEvent :: NavigateLeft ,
508+ UserEvent :: NavigateRight ,
509+ UserEvent :: ScrollUp ,
510+ UserEvent :: ScrollDown ,
511+ UserEvent :: PageUp ,
512+ UserEvent :: PageDown ,
513+ UserEvent :: HalfPageUp ,
514+ UserEvent :: HalfPageDown ,
515+ ] ;
516+
517+ for event in countable_events {
518+ let result = test_process_numeric_prefix_logic ( "3" , event) ;
519+ assert ! ( result. is_some( ) ) ;
520+ let event_with_count = result. unwrap ( ) ;
521+ assert_eq ! ( event_with_count. event, event) ;
522+ assert_eq ! ( event_with_count. count, 3 ) ;
523+ }
524+ }
525+
526+ #[ test]
527+ fn test_process_numeric_prefix_non_countable_events ( ) {
528+ let non_countable_events = [
529+ UserEvent :: Quit ,
530+ UserEvent :: Confirm ,
531+ UserEvent :: Cancel ,
532+ UserEvent :: HelpToggle ,
533+ UserEvent :: Search ,
534+ UserEvent :: ShortCopy ,
535+ UserEvent :: FullCopy ,
536+ ] ;
537+
538+ for event in non_countable_events {
539+ let result = test_process_numeric_prefix_logic ( "5" , event) ;
540+ assert ! ( result. is_none( ) ) ; // Should return None when prefix exists but event isn't countable
541+ }
542+ }
543+
544+ #[ test]
545+ fn test_process_numeric_prefix_non_countable_events_no_prefix ( ) {
546+ let result = test_process_numeric_prefix_logic ( "" , UserEvent :: Confirm ) ;
547+ assert ! ( result. is_some( ) ) ;
548+ let event_with_count = result. unwrap ( ) ;
549+ assert_eq ! ( event_with_count. event, UserEvent :: Confirm ) ;
550+ assert_eq ! ( event_with_count. count, 1 ) ;
551+ }
552+
553+ #[ test]
554+ fn test_process_numeric_prefix_large_numbers ( ) {
555+ let result = test_process_numeric_prefix_logic ( "999" , UserEvent :: NavigateDown ) ;
556+
557+ assert ! ( result. is_some( ) ) ;
558+ let event_with_count = result. unwrap ( ) ;
559+ assert_eq ! ( event_with_count. event, UserEvent :: NavigateDown ) ;
560+ assert_eq ! ( event_with_count. count, 999 ) ;
561+ }
562+
563+ #[ test]
564+ fn test_process_numeric_prefix_zero ( ) {
565+ let result = test_process_numeric_prefix_logic ( "0" , UserEvent :: NavigateUp ) ;
566+
567+ assert ! ( result. is_some( ) ) ;
568+ let event_with_count = result. unwrap ( ) ;
569+ assert_eq ! ( event_with_count. event, UserEvent :: NavigateUp ) ;
570+ assert_eq ! ( event_with_count. count, 1 ) ; // UserEventWithCount::new converts 0 to 1
571+ }
572+
573+ #[ test]
574+ fn test_process_numeric_prefix_multi_digit ( ) {
575+ let result = test_process_numeric_prefix_logic ( "42" , UserEvent :: ScrollDown ) ;
576+
577+ assert ! ( result. is_some( ) ) ;
578+ let event_with_count = result. unwrap ( ) ;
579+ assert_eq ! ( event_with_count. event, UserEvent :: ScrollDown ) ;
580+ assert_eq ! ( event_with_count. count, 42 ) ;
581+ }
582+ }
0 commit comments