1import unittest 2 3from _pyrepl.console import Event 4from _pyrepl.input import KeymapTranslator 5 6 7class KeymapTranslatorTests(unittest.TestCase): 8 def test_push_single_key(self): 9 keymap = [("a", "command_a")] 10 translator = KeymapTranslator(keymap) 11 evt = Event("key", "a") 12 translator.push(evt) 13 result = translator.get() 14 self.assertEqual(result, ("command_a", ["a"])) 15 16 def test_push_multiple_keys(self): 17 keymap = [("ab", "command_ab")] 18 translator = KeymapTranslator(keymap) 19 evt1 = Event("key", "a") 20 evt2 = Event("key", "b") 21 translator.push(evt1) 22 translator.push(evt2) 23 result = translator.get() 24 self.assertEqual(result, ("command_ab", ["a", "b"])) 25 26 def test_push_invalid_key(self): 27 keymap = [("a", "command_a")] 28 translator = KeymapTranslator(keymap) 29 evt = Event("key", "b") 30 translator.push(evt) 31 result = translator.get() 32 self.assertEqual(result, (None, ["b"])) 33 34 def test_push_invalid_key_with_stack(self): 35 keymap = [("ab", "command_ab")] 36 translator = KeymapTranslator(keymap) 37 evt1 = Event("key", "a") 38 evt2 = Event("key", "c") 39 translator.push(evt1) 40 translator.push(evt2) 41 result = translator.get() 42 self.assertEqual(result, (None, ["a", "c"])) 43 44 def test_push_character_key(self): 45 keymap = [("a", "command_a")] 46 translator = KeymapTranslator(keymap) 47 evt = Event("key", "a") 48 translator.push(evt) 49 result = translator.get() 50 self.assertEqual(result, ("command_a", ["a"])) 51 52 def test_push_character_key_with_stack(self): 53 keymap = [("ab", "command_ab")] 54 translator = KeymapTranslator(keymap) 55 evt1 = Event("key", "a") 56 evt2 = Event("key", "b") 57 evt3 = Event("key", "c") 58 translator.push(evt1) 59 translator.push(evt2) 60 translator.push(evt3) 61 result = translator.get() 62 self.assertEqual(result, ("command_ab", ["a", "b"])) 63 64 def test_push_transition_key(self): 65 keymap = [("a", {"b": "command_ab"})] 66 translator = KeymapTranslator(keymap) 67 evt1 = Event("key", "a") 68 evt2 = Event("key", "b") 69 translator.push(evt1) 70 translator.push(evt2) 71 result = translator.get() 72 self.assertEqual(result, ("command_ab", ["a", "b"])) 73 74 def test_push_transition_key_interrupted(self): 75 keymap = [("a", {"b": "command_ab"})] 76 translator = KeymapTranslator(keymap) 77 evt1 = Event("key", "a") 78 evt2 = Event("key", "c") 79 evt3 = Event("key", "b") 80 translator.push(evt1) 81 translator.push(evt2) 82 translator.push(evt3) 83 result = translator.get() 84 self.assertEqual(result, (None, ["a", "c"])) 85 86 def test_push_invalid_key_with_unicode_category(self): 87 keymap = [("a", "command_a")] 88 translator = KeymapTranslator(keymap) 89 evt = Event("key", "\u0003") # Control character 90 translator.push(evt) 91 result = translator.get() 92 self.assertEqual(result, (None, ["\u0003"])) 93 94 def test_empty(self): 95 keymap = [("a", "command_a")] 96 translator = KeymapTranslator(keymap) 97 self.assertTrue(translator.empty()) 98 evt = Event("key", "a") 99 translator.push(evt) 100 self.assertFalse(translator.empty()) 101 translator.get() 102 self.assertTrue(translator.empty()) 103