@@ -940,3 +940,158 @@ end
940940 strings3 = [" abcdef" , " 123456\n ijklmn" ]
941941 @test getcompletion (strings3) == " \0 33[0B\n abcdef\n 123456\n ijklmn\n "
942942end
943+
944+ # Test bracket insertion functionality
945+ @testset " Bracket insertion" begin
946+ # Test bracket insertion with fake REPL
947+ # Note: In practice, bracket_insert_keymap is added via auto_insert_closing_bracket option,
948+ # but here we test the keymap functions directly
949+ term = FakeTerminal (IOBuffer (), IOBuffer (), IOBuffer ())
950+ prompt = LineEdit. Prompt (" test> " )
951+ prompt. keymap_dict = LineEdit. bracket_insert_keymap
952+ interface = LineEdit. ModalInterface ([prompt])
953+ s = LineEdit. init_state (term, interface)
954+
955+ # Test left bracket at EOF triggers auto-complete
956+ LineEdit. bracket_insert_keymap[' (' ](s)
957+ @test content (s) == " ()"
958+ @test position (buffer (s)) == 1
959+
960+ # Test right bracket skips over matching bracket
961+ LineEdit. bracket_insert_keymap[' )' ](s)
962+ @test content (s) == " ()"
963+ @test position (buffer (s)) == 2
964+
965+ # Test backspace removes both brackets
966+ s = LineEdit. init_state (term, interface)
967+ LineEdit. bracket_insert_keymap[' (' ](s)
968+ LineEdit. bracket_insert_keymap[' \b ' ](s)
969+ @test content (s) == " "
970+ @test position (buffer (s)) == 0
971+
972+ # Test quote insertion at EOF
973+ s = LineEdit. init_state (term, interface)
974+ LineEdit. bracket_insert_keymap[' "' ](s)
975+ @test content (s) == " \"\" "
976+ @test position (buffer (s)) == 1
977+
978+ # Test quote skip over
979+ LineEdit. bracket_insert_keymap[' "' ](s)
980+ @test content (s) == " \"\" "
981+ @test position (buffer (s)) == 2
982+
983+ # Test transpose detection - single quote after letter shouldn't auto-complete
984+ s = LineEdit. init_state (term, interface)
985+ edit_insert (buffer (s), ' A' )
986+ LineEdit. bracket_insert_keymap[' \' ' ]( s)
987+ @test content (s) == " A'"
988+ @test position (buffer (s)) == 2
989+
990+ # Test single quote after space should auto-complete
991+ s = LineEdit. init_state (term, interface)
992+ edit_insert (buffer (s), ' ' )
993+ LineEdit. bracket_insert_keymap[' \' ' ](s)
994+ @test content (s) == " ''"
995+ @test position (buffer (s)) == 2
996+
997+ # Test bracket not inserted when next char is not whitespace
998+ s = LineEdit. init_state (term, interface)
999+ edit_insert (buffer (s), " x" )
1000+ charseek (buffer (s), 0 )
1001+ LineEdit. bracket_insert_keymap[' (' ](s)
1002+ @test content (s) == " (x"
1003+ @test position (buffer (s)) == 1
1004+
1005+ # Test all bracket types
1006+ for (left, right) in ((' [' , ' ]' ), (' {' , ' }' ))
1007+ s = LineEdit. init_state (term, interface)
1008+ LineEdit. bracket_insert_keymap[left](s)
1009+ @test content (s) == string (left, right)
1010+ @test position (buffer (s)) == 1
1011+ LineEdit. bracket_insert_keymap[right](s)
1012+ @test position (buffer (s)) == 2
1013+ LineEdit. bracket_insert_keymap[' \b ' ](s)
1014+ @test content (s) == string (left)
1015+ @test position (buffer (s)) == 1
1016+ LineEdit. bracket_insert_keymap[' \b ' ](s)
1017+ @test content (s) == " "
1018+ @test position (buffer (s)) == 0
1019+ end
1020+
1021+ # Test all quote types
1022+ for quote_char in (' `' , ' "' , ' \' ' )
1023+ s = LineEdit. init_state (term, interface)
1024+ LineEdit. bracket_insert_keymap[quote_char](s)
1025+ @test content (s) == string (quote_char, quote_char)
1026+ @test position (buffer (s)) == 1
1027+ end
1028+
1029+ # Test nested brackets
1030+ s = LineEdit. init_state (term, interface)
1031+ LineEdit. bracket_insert_keymap[' (' ](s)
1032+ LineEdit. bracket_insert_keymap[' [' ](s)
1033+ @test content (s) == " ([])"
1034+ @test position (buffer (s)) == 2
1035+ LineEdit. bracket_insert_keymap[' ]' ](s)
1036+ @test position (buffer (s)) == 3
1037+ LineEdit. bracket_insert_keymap[' )' ](s)
1038+ @test position (buffer (s)) == 4
1039+
1040+ # Test backspace in middle of nested brackets
1041+ s = LineEdit. init_state (term, interface)
1042+ LineEdit. bracket_insert_keymap[' (' ](s)
1043+ LineEdit. bracket_insert_keymap[' {' ](s)
1044+ @test content (s) == " ({})"
1045+ @test position (buffer (s)) == 2
1046+ LineEdit. bracket_insert_keymap[' \b ' ](s)
1047+ @test content (s) == " ()"
1048+ @test position (buffer (s)) == 1
1049+
1050+ # Test triple quotes don't auto-complete
1051+ s = LineEdit. init_state (term, interface)
1052+ LineEdit. bracket_insert_keymap[' "' ](s)
1053+ @test content (s) == " \"\" "
1054+ @test position (buffer (s)) == 1
1055+ LineEdit. bracket_insert_keymap[' "' ](s)
1056+ @test content (s) == " \"\" "
1057+ @test position (buffer (s)) == 2
1058+ LineEdit. bracket_insert_keymap[' "' ](s)
1059+ @test content (s) == " \"\"\" "
1060+ @test position (buffer (s)) == 3
1061+
1062+ # Test transpose detection for various cases
1063+ s = LineEdit. init_state (term, interface)
1064+ edit_insert (buffer (s), " x123" )
1065+ LineEdit. bracket_insert_keymap[' \' ' ](s)
1066+ @test content (s) == " x123'"
1067+ @test position (buffer (s)) == 5
1068+
1069+ s = LineEdit. init_state (term, interface)
1070+ edit_insert (buffer (s), " arr]" )
1071+ LineEdit. bracket_insert_keymap[' \' ' ](s)
1072+ @test content (s) == " arr]'"
1073+ @test position (buffer (s)) == 5
1074+
1075+ # Test right bracket insert when not matching
1076+ s = LineEdit. init_state (term, interface)
1077+ LineEdit. bracket_insert_keymap[' )' ](s)
1078+ @test content (s) == " )"
1079+ @test position (buffer (s)) == 1
1080+
1081+ # Test backspace doesn't remove mismatched brackets
1082+ s = LineEdit. init_state (term, interface)
1083+ LineEdit. bracket_insert_keymap[' (' ](s)
1084+ edit_insert (buffer (s), ' ]' )
1085+ charseek (buffer (s), 1 )
1086+ LineEdit. bracket_insert_keymap[' \b ' ](s)
1087+ @test content (s) == " ])"
1088+ @test position (buffer (s)) == 0
1089+
1090+ # Test bracket insertion followed by whitespace
1091+ s = LineEdit. init_state (term, interface)
1092+ edit_insert (buffer (s), " " )
1093+ charseek (buffer (s), 0 )
1094+ LineEdit. bracket_insert_keymap[' (' ](s)
1095+ @test content (s) == " () "
1096+ @test position (buffer (s)) == 1
1097+ end
0 commit comments