| import tempfile |
| import unittest |
| import sys |
| from unittest.mock import patch |
| |
| try: |
| from _pyrepl.console import Event |
| from _pyrepl.unix_eventqueue import EventQueue |
| except ImportError: |
| pass |
| |
| @unittest.skipIf(sys.platform == "win32", "No Unix event queue on Windows") |
| @patch("_pyrepl.curses.tigetstr", lambda x: b"") |
| class TestUnixEventQueue(unittest.TestCase): |
| def setUp(self): |
| self.file = tempfile.TemporaryFile() |
| |
| def tearDown(self) -> None: |
| self.file.close() |
| |
| def test_get(self): |
| eq = EventQueue(self.file.fileno(), "utf-8") |
| event = Event("key", "a", b"a") |
| eq.insert(event) |
| self.assertEqual(eq.get(), event) |
| |
| def test_empty(self): |
| eq = EventQueue(self.file.fileno(), "utf-8") |
| self.assertTrue(eq.empty()) |
| eq.insert(Event("key", "a", b"a")) |
| self.assertFalse(eq.empty()) |
| |
| def test_flush_buf(self): |
| eq = EventQueue(self.file.fileno(), "utf-8") |
| eq.buf.extend(b"test") |
| self.assertEqual(eq.flush_buf(), b"test") |
| self.assertEqual(eq.buf, bytearray()) |
| |
| def test_insert(self): |
| eq = EventQueue(self.file.fileno(), "utf-8") |
| event = Event("key", "a", b"a") |
| eq.insert(event) |
| self.assertEqual(eq.events[0], event) |
| |
| @patch("_pyrepl.unix_eventqueue.keymap") |
| def test_push_with_key_in_keymap(self, mock_keymap): |
| mock_keymap.compile_keymap.return_value = {"a": "b"} |
| eq = EventQueue(self.file.fileno(), "utf-8") |
| eq.keymap = {b"a": "b"} |
| eq.push("a") |
| mock_keymap.compile_keymap.assert_called() |
| self.assertEqual(eq.events[0].evt, "key") |
| self.assertEqual(eq.events[0].data, "b") |
| |
| @patch("_pyrepl.unix_eventqueue.keymap") |
| def test_push_without_key_in_keymap(self, mock_keymap): |
| mock_keymap.compile_keymap.return_value = {"a": "b"} |
| eq = EventQueue(self.file.fileno(), "utf-8") |
| eq.keymap = {b"c": "d"} |
| eq.push("a") |
| mock_keymap.compile_keymap.assert_called() |
| self.assertEqual(eq.events[0].evt, "key") |
| self.assertEqual(eq.events[0].data, "a") |
| |
| @patch("_pyrepl.unix_eventqueue.keymap") |
| def test_push_with_keymap_in_keymap(self, mock_keymap): |
| mock_keymap.compile_keymap.return_value = {"a": "b"} |
| eq = EventQueue(self.file.fileno(), "utf-8") |
| eq.keymap = {b"a": {b"b": "c"}} |
| eq.push("a") |
| mock_keymap.compile_keymap.assert_called() |
| self.assertTrue(eq.empty()) |
| eq.push("b") |
| self.assertEqual(eq.events[0].evt, "key") |
| self.assertEqual(eq.events[0].data, "c") |
| eq.push("d") |
| self.assertEqual(eq.events[1].evt, "key") |
| self.assertEqual(eq.events[1].data, "d") |
| |
| @patch("_pyrepl.unix_eventqueue.keymap") |
| def test_push_with_keymap_in_keymap_and_escape(self, mock_keymap): |
| mock_keymap.compile_keymap.return_value = {"a": "b"} |
| eq = EventQueue(self.file.fileno(), "utf-8") |
| eq.keymap = {b"a": {b"b": "c"}} |
| eq.push("a") |
| mock_keymap.compile_keymap.assert_called() |
| self.assertTrue(eq.empty()) |
| eq.flush_buf() |
| eq.push("\033") |
| self.assertEqual(eq.events[0].evt, "key") |
| self.assertEqual(eq.events[0].data, "\033") |
| eq.push("b") |
| self.assertEqual(eq.events[1].evt, "key") |
| self.assertEqual(eq.events[1].data, "b") |
| |
| def test_push_special_key(self): |
| eq = EventQueue(self.file.fileno(), "utf-8") |
| eq.keymap = {} |
| eq.push("\x1b") |
| eq.push("[") |
| eq.push("A") |
| self.assertEqual(eq.events[0].evt, "key") |
| self.assertEqual(eq.events[0].data, "\x1b") |
| |
| def test_push_unrecognized_escape_sequence(self): |
| eq = EventQueue(self.file.fileno(), "utf-8") |
| eq.keymap = {} |
| eq.push("\x1b") |
| eq.push("[") |
| eq.push("Z") |
| self.assertEqual(len(eq.events), 3) |
| self.assertEqual(eq.events[0].evt, "key") |
| self.assertEqual(eq.events[0].data, "\x1b") |
| self.assertEqual(eq.events[1].evt, "key") |
| self.assertEqual(eq.events[1].data, "[") |
| self.assertEqual(eq.events[2].evt, "key") |
| self.assertEqual(eq.events[2].data, "Z") |