@@ -966,3 +966,86 @@ def test_hook_scope_handling(
966966 window .unset_hook (hook_name )
967967 else :
968968 pane .unset_hook (hook_name )
969+
970+
971+ # =============================================================================
972+ # show_hooks Parsing Edge Cases
973+ # =============================================================================
974+
975+
976+ class ShowHooksParseTestCase (t .NamedTuple ):
977+ """Test case for show_hooks output parsing edge cases."""
978+
979+ test_id : str
980+ setup_commands : list [tuple [str , str ]] # List of (hook[idx], value) to set
981+ expected_keys : list [str ] # Expected keys in result
982+ check_values : bool = True # Whether to verify specific values
983+
984+
985+ SHOW_HOOKS_PARSE_TEST_CASES : list [ShowHooksParseTestCase ] = [
986+ ShowHooksParseTestCase (
987+ "normal_hook_value" ,
988+ [("session-renamed[0]" , "display-message 'test'" )],
989+ ["session-renamed[0]" ],
990+ ),
991+ ShowHooksParseTestCase (
992+ "multiple_indexed_hooks" ,
993+ [
994+ ("session-renamed[0]" , "display-message 'first'" ),
995+ ("session-renamed[1]" , "display-message 'second'" ),
996+ ("session-renamed[5]" , "display-message 'fifth'" ),
997+ ],
998+ ["session-renamed[0]" , "session-renamed[1]" , "session-renamed[5]" ],
999+ ),
1000+ ShowHooksParseTestCase (
1001+ "multiple_different_hooks" ,
1002+ [
1003+ ("session-renamed[0]" , "display-message 'renamed'" ),
1004+ ("after-split-window[0]" , "display-message 'split'" ),
1005+ ],
1006+ ["session-renamed[0]" , "after-split-window[0]" ],
1007+ ),
1008+ ]
1009+
1010+
1011+ @pytest .mark .parametrize (
1012+ "test_case" ,
1013+ [pytest .param (tc , id = tc .test_id ) for tc in SHOW_HOOKS_PARSE_TEST_CASES ],
1014+ )
1015+ def test_show_hooks_parsing_edge_cases (
1016+ server : Server ,
1017+ test_case : ShowHooksParseTestCase ,
1018+ ) -> None :
1019+ """Test show_hooks parses various output formats correctly."""
1020+ session = server .new_session (session_name = "test_parsing" )
1021+
1022+ # Setup hooks
1023+ for hook , value in test_case .setup_commands :
1024+ session .set_hook (hook , value )
1025+
1026+ # Get all hooks via show_hooks
1027+ hooks = session .show_hooks ()
1028+
1029+ # Verify expected keys are present
1030+ for key in test_case .expected_keys :
1031+ assert key in hooks , f"Expected key { key } not found in { list (hooks .keys ())} "
1032+
1033+ if test_case .check_values :
1034+ for key in test_case .expected_keys :
1035+ assert hooks [key ] is not None , f"Expected value for { key } to be non-None"
1036+
1037+ # Cleanup
1038+ for hook , _ in test_case .setup_commands :
1039+ base_hook = hook .split ("[" )[0 ]
1040+ session .unset_hook (base_hook )
1041+
1042+
1043+ def test_show_hooks_empty_result (server : Server ) -> None :
1044+ """Test show_hooks returns empty dict when no hooks are set."""
1045+ session = server .new_session (session_name = "test_empty_hooks" )
1046+
1047+ # Fresh session should have no session-level hooks
1048+ hooks = session .show_hooks ()
1049+
1050+ # Should be a dict (possibly empty)
1051+ assert isinstance (hooks , dict )
0 commit comments