@@ -517,84 +517,24 @@ def test_new_hooks_version_gated(server: Server, test_case: HookTestCase) -> Non
517517
518518
519519# =============================================================================
520- # Bulk Operations API Tests
520+ # set_hooks Tests
521521# =============================================================================
522522
523523
524- class BulkOpTestCase (t .NamedTuple ):
525- """Test case for bulk hook operations."""
524+ class SetHooksTestCase (t .NamedTuple ):
525+ """Test case for set_hooks operations."""
526526
527527 test_id : str
528- operation : str # "get_indices", "get_values", "set_bulk", "clear", "append"
529528 hook : str # Hook name to test
530529 setup_hooks : dict [int , str ] # Initial hooks to set (index -> value)
531- operation_args : dict [str , t .Any ] # Args for operation
530+ operation_args : dict [str , t .Any ] # Args for set_hooks
532531 expected_indices : list [int ] # Expected indices after operation
533532 expected_contains : list [str ] | None = None # Strings expected in values
534533
535534
536- # --- get_hook_indices tests ---
537- GET_INDICES_TESTS : list [BulkOpTestCase ] = [
538- BulkOpTestCase (
539- "get_indices_empty" ,
540- "get_indices" ,
541- "session-renamed" ,
542- {},
543- {},
544- [],
545- ),
546- BulkOpTestCase (
547- "get_indices_sequential" ,
548- "get_indices" ,
549- "session-renamed" ,
550- {
551- 0 : "display-message 'hook 0'" ,
552- 1 : "display-message 'hook 1'" ,
553- 2 : "display-message 'hook 2'" ,
554- },
555- {},
556- [0 , 1 , 2 ],
557- ),
558- BulkOpTestCase (
559- "get_indices_sparse" ,
560- "get_indices" ,
561- "session-renamed" ,
562- {
563- 0 : "display-message 'hook 0'" ,
564- 5 : "display-message 'hook 5'" ,
565- 10 : "display-message 'hook 10'" ,
566- },
567- {},
568- [0 , 5 , 10 ],
569- ),
570- ]
571-
572- # --- get_hook_values tests ---
573- GET_VALUES_TESTS : list [BulkOpTestCase ] = [
574- BulkOpTestCase (
575- "get_values_empty" ,
576- "get_values" ,
577- "session-renamed" ,
578- {},
579- {},
580- [],
581- ),
582- BulkOpTestCase (
583- "get_values_sparse" ,
584- "get_values" ,
585- "session-renamed" ,
586- {0 : "display-message 'hook 0'" , 5 : "display-message 'hook 5'" },
587- {},
588- [0 , 5 ],
589- ["display-message" ],
590- ),
591- ]
592-
593- # --- set_hooks tests ---
594- SET_BULK_TESTS : list [BulkOpTestCase ] = [
595- BulkOpTestCase (
596- "set_bulk_with_dict" ,
597- "set_bulk" ,
535+ SET_HOOKS_TESTS : list [SetHooksTestCase ] = [
536+ SetHooksTestCase (
537+ "set_hooks_with_dict" ,
598538 "session-renamed" ,
599539 {},
600540 {
@@ -607,9 +547,8 @@ class BulkOpTestCase(t.NamedTuple):
607547 [0 , 1 , 5 ],
608548 ["hook 0" , "hook 1" , "hook 5" ],
609549 ),
610- BulkOpTestCase (
611- "set_bulk_with_list" ,
612- "set_bulk" ,
550+ SetHooksTestCase (
551+ "set_hooks_with_list" ,
613552 "session-renamed" ,
614553 {},
615554 {
@@ -621,9 +560,8 @@ class BulkOpTestCase(t.NamedTuple):
621560 },
622561 [0 , 1 , 2 ],
623562 ),
624- BulkOpTestCase (
625- "set_bulk_clear_existing" ,
626- "set_bulk" ,
563+ SetHooksTestCase (
564+ "set_hooks_clear_existing" ,
627565 "session-renamed" ,
628566 {0 : "display-message 'old 0'" , 1 : "display-message 'old 1'" },
629567 {"values" : {0 : "display-message 'new 0'" }, "clear_existing" : True },
@@ -632,175 +570,151 @@ class BulkOpTestCase(t.NamedTuple):
632570 ),
633571]
634572
635- # --- clear_hook tests ---
636- CLEAR_TESTS : list [BulkOpTestCase ] = [
637- BulkOpTestCase (
638- "clear_hook" ,
639- "clear" ,
640- "session-renamed" ,
641- {0 : "display-message 'hook 0'" , 5 : "display-message 'hook 5'" },
642- {},
643- [],
644- ),
645- ]
646-
647- # --- append_hook tests ---
648- APPEND_TESTS : list [BulkOpTestCase ] = [
649- BulkOpTestCase (
650- "append_to_empty" ,
651- "append" ,
652- "session-renamed" ,
653- {},
654- {"value" : "display-message 'appended'" },
655- [0 ],
656- ["appended" ],
657- ),
658- BulkOpTestCase (
659- "append_sequential" ,
660- "append" ,
661- "session-renamed" ,
662- {0 : "display-message 'initial'" },
663- {"value" : "display-message 'appended'" },
664- [0 , 1 ],
665- ),
666- BulkOpTestCase (
667- "append_after_sparse" ,
668- "append" ,
669- "session-renamed" ,
670- {0 : "display-message 'at 0'" , 10 : "display-message 'at 10'" },
671- {"value" : "display-message 'appended'" },
672- [0 , 10 , 11 ],
673- ["appended" ],
674- ),
675- ]
676-
677- # Combine all bulk operation test cases
678- ALL_BULK_OP_TESTS : list [BulkOpTestCase ] = (
679- GET_INDICES_TESTS + GET_VALUES_TESTS + SET_BULK_TESTS + CLEAR_TESTS + APPEND_TESTS
680- )
681-
682573
683- def _build_bulk_op_params () -> list [t .Any ]:
684- """Build pytest params for bulk operation tests."""
685- return [pytest .param (tc , id = tc .test_id ) for tc in ALL_BULK_OP_TESTS ]
574+ def _build_set_hooks_params () -> list [t .Any ]:
575+ """Build pytest params for set_hooks tests."""
576+ return [pytest .param (tc , id = tc .test_id ) for tc in SET_HOOKS_TESTS ]
686577
687578
688- @pytest .mark .parametrize ("test_case" , _build_bulk_op_params ())
689- def test_bulk_hook_operation (server : Server , test_case : BulkOpTestCase ) -> None :
690- """Test bulk hook operations.
691-
692- This parametrized test ensures all bulk operations work correctly:
693- - get_hook_indices: returns sorted list of existing indices
694- - get_hook_values: returns SparseArray with values
695- - set_hooks: sets multiple hooks at once
696- - clear_hook: removes all indexed values
697- - append_hook: appends at next available index
698- """
699- session = server .new_session (session_name = "test_bulk_ops" )
579+ @pytest .mark .parametrize ("test_case" , _build_set_hooks_params ())
580+ def test_set_hooks (server : Server , test_case : SetHooksTestCase ) -> None :
581+ """Test set_hooks operations."""
582+ session = server .new_session (session_name = "test_set_hooks" )
700583
701584 # Setup initial hooks
702585 for idx , val in test_case .setup_hooks .items ():
703586 session .set_hook (f"{ test_case .hook } [{ idx } ]" , val )
704587
705- # Perform operation based on type
706- if test_case .operation == "get_indices" :
707- result = session .get_hook_indices (test_case .hook )
708- assert result == test_case .expected_indices
709-
710- elif test_case .operation == "get_values" :
711- values = session .get_hook_values (test_case .hook )
712- assert isinstance (values , SparseArray )
713- assert sorted (values .keys ()) == test_case .expected_indices
714- if test_case .expected_contains :
715- for expected_str in test_case .expected_contains :
716- assert any (expected_str in v for v in values .values ())
717-
718- elif test_case .operation == "set_bulk" :
719- session .set_hooks (test_case .hook , ** test_case .operation_args )
720- indices = session .get_hook_indices (test_case .hook )
721- assert indices == test_case .expected_indices
722- if test_case .expected_contains :
723- values = session .get_hook_values (test_case .hook )
724- for expected_str in test_case .expected_contains :
725- assert any (expected_str in v for v in values .values ())
726-
727- elif test_case .operation == "clear" :
728- session .clear_hook (test_case .hook )
729- indices = session .get_hook_indices (test_case .hook )
730- assert indices == test_case .expected_indices
731-
732- elif test_case .operation == "append" :
733- session .append_hook (test_case .hook , test_case .operation_args ["value" ])
734- indices = session .get_hook_indices (test_case .hook )
735- assert indices == test_case .expected_indices
736- if test_case .expected_contains :
737- values = session .get_hook_values (test_case .hook )
738- for expected_str in test_case .expected_contains :
739- assert any (expected_str in v for v in values .values ())
588+ # Perform set_hooks
589+ session .set_hooks (test_case .hook , ** test_case .operation_args )
590+
591+ # Verify via show_hook
592+ hooks = session .show_hook (test_case .hook )
593+ assert hooks is not None
594+ assert isinstance (hooks , SparseArray )
595+ assert sorted (hooks .keys ()) == test_case .expected_indices
596+
597+ if test_case .expected_contains :
598+ for expected_str in test_case .expected_contains :
599+ assert any (expected_str in v for v in hooks .values ())
740600
741601 # Cleanup
742- session .clear_hook (test_case .hook )
602+ session .unset_hook (test_case .hook )
743603
744604
745- def test_bulk_hook_values_iteration (server : Server ) -> None :
746- """Test iterating over hook values in sorted order ."""
747- session = server .new_session (session_name = "test_bulk_ops " )
605+ def test_show_hook_returns_sparse_array (server : Server ) -> None :
606+ """Test that show_hook returns SparseArray for array hooks ."""
607+ session = server .new_session (session_name = "test_show_hook " )
748608
749609 # Set hooks at sparse indices (out of order)
750610 session .set_hook ("session-renamed[5]" , "display-message 'fifth'" )
751611 session .set_hook ("session-renamed[0]" , "display-message 'zeroth'" )
752612 session .set_hook ("session-renamed[2]" , "display-message 'second'" )
753613
754- values = session .get_hook_values ("session-renamed" )
755- value_list = list (values .iter_values ())
614+ hooks = session .show_hook ("session-renamed" )
615+ assert hooks is not None
616+ assert isinstance (hooks , SparseArray )
756617
757- # Values should be in sorted index order
618+ # Check keys (indices)
619+ assert sorted (hooks .keys ()) == [0 , 2 , 5 ]
620+
621+ # Check values via iter_values (sorted order)
622+ value_list = list (hooks .iter_values ())
758623 assert len (value_list ) == 3
759624 assert "zeroth" in value_list [0 ]
760625 assert "second" in value_list [1 ]
761626 assert "fifth" in value_list [2 ]
762627
763628 # Cleanup
764- session .clear_hook ("session-renamed" )
629+ session .unset_hook ("session-renamed" )
765630
766631
767- def test_bulk_hook_set_with_sparse_array (server : Server ) -> None :
632+ def test_set_hooks_with_sparse_array (server : Server ) -> None :
768633 """Test set_hooks with SparseArray input."""
769- session = server .new_session (session_name = "test_bulk_ops " )
634+ session = server .new_session (session_name = "test_set_hooks_sparse " )
770635
771636 sparse : SparseArray [str ] = SparseArray ()
772637 sparse .add (0 , "display-message 'from sparse 0'" )
773638 sparse .add (10 , "display-message 'from sparse 10'" )
774639
775640 session .set_hooks ("session-renamed" , sparse )
776641
777- indices = session .get_hook_indices ("session-renamed" )
778- assert indices == [0 , 10 ]
642+ hooks = session .show_hook ("session-renamed" )
643+ assert hooks is not None
644+ assert isinstance (hooks , SparseArray )
645+ assert sorted (hooks .keys ()) == [0 , 10 ]
779646
780647 # Cleanup
781- session .clear_hook ("session-renamed" )
648+ session .unset_hook ("session-renamed" )
782649
783650
784- def test_bulk_hook_method_chaining (server : Server ) -> None :
785- """Test that bulk operations support method chaining."""
786- session = server .new_session (session_name = "test_bulk_ops " )
651+ def test_set_hooks_method_chaining (server : Server ) -> None :
652+ """Test that set_hooks supports method chaining."""
653+ session = server .new_session (session_name = "test_set_hooks_chain " )
787654
788- # Chain operations
655+ # Chain set_hooks with set_hook (append=True)
789656 result = (
790657 session .set_hooks (
791658 "session-renamed" ,
792659 ["display-message 'hook 0'" ],
793660 )
794- .append_hook ("session-renamed" , "display-message 'hook 1'" )
795- .append_hook ("session-renamed" , "display-message 'hook 2'" )
661+ .set_hook ("session-renamed" , "display-message 'hook 1'" , append = True )
662+ .set_hook ("session-renamed" , "display-message 'hook 2'" , append = True )
796663 )
797664
798665 # Should return the session
799666 assert result is session
800667
801- # Verify all hooks set
802- indices = session .get_hook_indices ("session-renamed" )
803- assert indices == [0 , 1 , 2 ]
668+ # Verify all hooks set via show_hook
669+ hooks = session .show_hook ("session-renamed" )
670+ assert hooks is not None
671+ assert isinstance (hooks , SparseArray )
672+ assert sorted (hooks .keys ()) == [0 , 1 , 2 ]
673+
674+ # Cleanup
675+ session .unset_hook ("session-renamed" )
676+
677+
678+ def test_unset_hook_clears_all_indices (server : Server ) -> None :
679+ """Test that unset_hook without index clears all hook indices."""
680+ session = server .new_session (session_name = "test_unset_hook" )
681+
682+ # Set hooks at multiple indices
683+ session .set_hook ("session-renamed[0]" , "display-message 'hook 0'" )
684+ session .set_hook ("session-renamed[5]" , "display-message 'hook 5'" )
685+ session .set_hook ("session-renamed[10]" , "display-message 'hook 10'" )
686+
687+ # Verify hooks exist
688+ hooks = session .show_hook ("session-renamed" )
689+ assert hooks is not None
690+ assert isinstance (hooks , SparseArray )
691+ assert sorted (hooks .keys ()) == [0 , 5 , 10 ]
692+
693+ # Unset without index should clear all
694+ session .unset_hook ("session-renamed" )
695+
696+ # Verify hooks are cleared
697+ hooks_after = session .show_hook ("session-renamed" )
698+ assert hooks_after is None or (
699+ isinstance (hooks_after , SparseArray ) and len (hooks_after ) == 0
700+ )
701+
702+
703+ def test_set_hook_append_flag (server : Server ) -> None :
704+ """Test set_hook with append=True uses tmux's -a flag."""
705+ session = server .new_session (session_name = "test_append_flag" )
706+
707+ # Set initial hook
708+ session .set_hook ("session-renamed[0]" , "display-message 'initial'" )
709+
710+ # Append using set_hook with append=True
711+ session .set_hook ("session-renamed" , "display-message 'appended'" , append = True )
712+
713+ # Verify both hooks exist
714+ hooks = session .show_hook ("session-renamed" )
715+ assert hooks is not None
716+ assert isinstance (hooks , SparseArray )
717+ assert len (hooks ) == 2
804718
805719 # Cleanup
806- session .clear_hook ("session-renamed" )
720+ session .unset_hook ("session-renamed" )
0 commit comments