23
23
from _pyrepl .readline import ReadlineAlikeReader , ReadlineConfig
24
24
from _pyrepl .simple_interact import _strip_final_indent
25
25
from _pyrepl .unix_eventqueue import EventQueue
26
+ from _pyrepl .input import KeymapTranslator
26
27
27
28
28
29
def more_lines (unicodetext , namespace = None ):
@@ -931,6 +932,103 @@ def test_setpos_fromxy_in_wrapped_line(self):
931
932
reader .setpos_from_xy (0 , 1 )
932
933
self .assertEqual (reader .pos , 9 )
933
934
935
+ class KeymapTranslatorTests (unittest .TestCase ):
936
+ def test_push_single_key (self ):
937
+ keymap = [("a" , "command_a" )]
938
+ translator = KeymapTranslator (keymap )
939
+ evt = Event ("key" , "a" )
940
+ translator .push (evt )
941
+ result = translator .get ()
942
+ self .assertEqual (result , ("command_a" , ["a" ]))
943
+
944
+ def test_push_multiple_keys (self ):
945
+ keymap = [("ab" , "command_ab" )]
946
+ translator = KeymapTranslator (keymap )
947
+ evt1 = Event ("key" , "a" )
948
+ evt2 = Event ("key" , "b" )
949
+ translator .push (evt1 )
950
+ translator .push (evt2 )
951
+ result = translator .get ()
952
+ self .assertEqual (result , ("command_ab" , ["a" , "b" ]))
953
+
954
+ def test_push_invalid_key (self ):
955
+ keymap = [("a" , "command_a" )]
956
+ translator = KeymapTranslator (keymap )
957
+ evt = Event ("key" , "b" )
958
+ translator .push (evt )
959
+ result = translator .get ()
960
+ self .assertEqual (result , (None , ["b" ]))
961
+
962
+ def test_push_invalid_key_with_stack (self ):
963
+ keymap = [("ab" , "command_ab" )]
964
+ translator = KeymapTranslator (keymap )
965
+ evt1 = Event ("key" , "a" )
966
+ evt2 = Event ("key" , "c" )
967
+ translator .push (evt1 )
968
+ translator .push (evt2 )
969
+ result = translator .get ()
970
+ self .assertEqual (result , (None , ["a" , "c" ]))
971
+
972
+ def test_push_character_key (self ):
973
+ keymap = [("a" , "command_a" )]
974
+ translator = KeymapTranslator (keymap )
975
+ evt = Event ("key" , "a" )
976
+ translator .push (evt )
977
+ result = translator .get ()
978
+ self .assertEqual (result , ("command_a" , ["a" ]))
979
+
980
+ def test_push_character_key_with_stack (self ):
981
+ keymap = [("ab" , "command_ab" )]
982
+ translator = KeymapTranslator (keymap )
983
+ evt1 = Event ("key" , "a" )
984
+ evt2 = Event ("key" , "b" )
985
+ evt3 = Event ("key" , "c" )
986
+ translator .push (evt1 )
987
+ translator .push (evt2 )
988
+ translator .push (evt3 )
989
+ result = translator .get ()
990
+ self .assertEqual (result , ("command_ab" , ["a" , "b" ]))
991
+
992
+ def test_push_transition_key (self ):
993
+ keymap = [("a" , {"b" : "command_ab" })]
994
+ translator = KeymapTranslator (keymap )
995
+ evt1 = Event ("key" , "a" )
996
+ evt2 = Event ("key" , "b" )
997
+ translator .push (evt1 )
998
+ translator .push (evt2 )
999
+ result = translator .get ()
1000
+ self .assertEqual (result , ("command_ab" , ["a" , "b" ]))
1001
+
1002
+ def test_push_transition_key_interrupted (self ):
1003
+ keymap = [("a" , {"b" : "command_ab" })]
1004
+ translator = KeymapTranslator (keymap )
1005
+ evt1 = Event ("key" , "a" )
1006
+ evt2 = Event ("key" , "c" )
1007
+ evt3 = Event ("key" , "b" )
1008
+ translator .push (evt1 )
1009
+ translator .push (evt2 )
1010
+ translator .push (evt3 )
1011
+ result = translator .get ()
1012
+ self .assertEqual (result , (None , ["a" , "c" ]))
1013
+
1014
+ def test_push_invalid_key_with_unicode_category (self ):
1015
+ keymap = [("a" , "command_a" )]
1016
+ translator = KeymapTranslator (keymap )
1017
+ evt = Event ("key" , "\u0003 " ) # Control character
1018
+ translator .push (evt )
1019
+ result = translator .get ()
1020
+ self .assertEqual (result , (None , ["\u0003 " ]))
1021
+
1022
+ def test_empty (self ):
1023
+ keymap = [("a" , "command_a" )]
1024
+ translator = KeymapTranslator (keymap )
1025
+ self .assertTrue (translator .empty ())
1026
+ evt = Event ("key" , "a" )
1027
+ translator .push (evt )
1028
+ self .assertFalse (translator .empty ())
1029
+ translator .get ()
1030
+ self .assertTrue (translator .empty ())
1031
+
934
1032
935
1033
if __name__ == "__main__" :
936
1034
unittest .main ()
0 commit comments