lowobservable.oec/tests/test_keyboard.py
2023-01-10 23:30:39 -06:00

212 lines
13 KiB
Python

import unittest
import context
from oec.keyboard import KeyboardModifiers, Key, Keymap, Keyboard, get_character_for_key
from oec.keymap_3278_typewriter import KEYMAP as KEYMAP_3278_TYPEWRITER
from oec.keymap_ibm_typewriter import KEYMAP as KEYMAP_IBM_TYPEWRITER
class KeyboardModifiersTestCase(unittest.TestCase):
def test_is_shift(self):
for modifiers in [KeyboardModifiers.LEFT_SHIFT, KeyboardModifiers.RIGHT_SHIFT, KeyboardModifiers.LEFT_SHIFT | KeyboardModifiers.RIGHT_SHIFT, KeyboardModifiers.LEFT_SHIFT | KeyboardModifiers.LEFT_ALT, KeyboardModifiers.RIGHT_SHIFT | KeyboardModifiers.CAPS_LOCK]:
with self.subTest(modifiers=input):
self.assertTrue(modifiers.is_shift())
def test_not_is_shift(self):
for modifiers in [KeyboardModifiers.NONE, KeyboardModifiers.LEFT_ALT, KeyboardModifiers.RIGHT_ALT, KeyboardModifiers.CAPS_LOCK]:
with self.subTest(modifiers=input):
self.assertFalse(modifiers.is_shift())
def test_is_alt(self):
for modifiers in [KeyboardModifiers.LEFT_ALT, KeyboardModifiers.RIGHT_ALT, KeyboardModifiers.LEFT_ALT | KeyboardModifiers.RIGHT_ALT, KeyboardModifiers.LEFT_ALT | KeyboardModifiers.LEFT_SHIFT, KeyboardModifiers.RIGHT_ALT | KeyboardModifiers.CAPS_LOCK]:
with self.subTest(modifiers=input):
self.assertTrue(modifiers.is_alt())
def test_not_is_alt(self):
for modifiers in [KeyboardModifiers.NONE, KeyboardModifiers.LEFT_SHIFT, KeyboardModifiers.RIGHT_SHIFT, KeyboardModifiers.CAPS_LOCK]:
with self.subTest(modifiers=input):
self.assertFalse(modifiers.is_alt())
def test_is_caps_lock(self):
for modifiers in [KeyboardModifiers.CAPS_LOCK, KeyboardModifiers.CAPS_LOCK | KeyboardModifiers.LEFT_SHIFT, KeyboardModifiers.CAPS_LOCK | KeyboardModifiers.LEFT_ALT]:
with self.subTest(modifiers=input):
self.assertTrue(modifiers.is_caps_lock())
def test_not_is_caps_lock(self):
for modifiers in [KeyboardModifiers.NONE, KeyboardModifiers.LEFT_SHIFT, KeyboardModifiers.RIGHT_SHIFT, KeyboardModifiers.LEFT_ALT, KeyboardModifiers.RIGHT_ALT]:
with self.subTest(modifiers=input):
self.assertFalse(modifiers.is_caps_lock())
class KeyboardGetKeySingleModifierReleaseTestCase(unittest.TestCase):
def setUp(self):
self.keyboard = Keyboard(KEYMAP_IBM_TYPEWRITER)
def test_single_modifier_release_is_true(self):
self.assertTrue(self.keyboard.single_modifier_release)
def test_default(self):
self._assert_get_key(28, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(50, Key.LOWER_B, KeyboardModifiers.NONE, False)
self._assert_get_key(33, Key.LOWER_C, KeyboardModifiers.NONE, False)
self._assert_get_key(35, Key.LOWER_D, KeyboardModifiers.NONE, False)
def test_shift(self):
self._assert_get_key(28, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(18, Key.LEFT_SHIFT, KeyboardModifiers.LEFT_SHIFT, True)
self._assert_get_key(50, Key.UPPER_B, KeyboardModifiers.LEFT_SHIFT, False)
self._assert_get_key(89, Key.RIGHT_SHIFT, KeyboardModifiers.LEFT_SHIFT | KeyboardModifiers.RIGHT_SHIFT, True)
self._assert_get_key(33, Key.UPPER_C, KeyboardModifiers.LEFT_SHIFT | KeyboardModifiers.RIGHT_SHIFT, False)
self._assert_get_key(240, None, KeyboardModifiers.LEFT_SHIFT | KeyboardModifiers.RIGHT_SHIFT, False)
self._assert_get_key(18, None, KeyboardModifiers.RIGHT_SHIFT, True)
self._assert_get_key(35, Key.UPPER_D, KeyboardModifiers.RIGHT_SHIFT, False)
self._assert_get_key(240, None, KeyboardModifiers.RIGHT_SHIFT, False)
self._assert_get_key(89, None, KeyboardModifiers.NONE, True)
self._assert_get_key(36, Key.LOWER_E, KeyboardModifiers.NONE, False)
# TODO... include the additional ALT reset scan_code!
def test_mapped_alt(self):
self._assert_get_key(28, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(57, Key.RIGHT_ALT, KeyboardModifiers.RIGHT_ALT, True)
self._assert_get_key(50, Key.LOWER_B, KeyboardModifiers.RIGHT_ALT, False)
self._assert_get_key(240, None, KeyboardModifiers.RIGHT_ALT, False)
self._assert_get_key(57, None, KeyboardModifiers.NONE, True)
self._assert_get_key(33, Key.LOWER_C, KeyboardModifiers.NONE, False)
def test_unmapped_alt(self):
self._assert_get_key(28, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(57, Key.RIGHT_ALT, KeyboardModifiers.RIGHT_ALT, True)
self._assert_get_key(50, Key.LOWER_B, KeyboardModifiers.RIGHT_ALT, False)
self._assert_get_key(240, None, KeyboardModifiers.RIGHT_ALT, False)
self._assert_get_key(57, None, KeyboardModifiers.NONE, True)
self._assert_get_key(33, Key.LOWER_C, KeyboardModifiers.NONE, False)
def test_alt_and_shift(self):
self._assert_get_key(28, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(57, Key.RIGHT_ALT, KeyboardModifiers.RIGHT_ALT, True)
self._assert_get_key(50, Key.LOWER_B, KeyboardModifiers.RIGHT_ALT, False)
self._assert_get_key(18, Key.LEFT_SHIFT, KeyboardModifiers.RIGHT_ALT | KeyboardModifiers.LEFT_SHIFT, True)
self._assert_get_key(33, Key.UPPER_C, KeyboardModifiers.RIGHT_ALT | KeyboardModifiers.LEFT_SHIFT, False)
self._assert_get_key(240, None, KeyboardModifiers.RIGHT_ALT | KeyboardModifiers.LEFT_SHIFT, False)
self._assert_get_key(18, None, KeyboardModifiers.RIGHT_ALT, True)
self._assert_get_key(35, Key.LOWER_D, KeyboardModifiers.RIGHT_ALT, False)
self._assert_get_key(240, None, KeyboardModifiers.RIGHT_ALT, False)
self._assert_get_key(57, None, KeyboardModifiers.NONE, True)
self._assert_get_key(36, Key.LOWER_E, KeyboardModifiers.NONE, False)
def test_caps_lock(self):
self._assert_get_key(28, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(20, Key.CAPS_LOCK, KeyboardModifiers.CAPS_LOCK, True)
self._assert_get_key(240, None, KeyboardModifiers.CAPS_LOCK, False)
self._assert_get_key(20, None, KeyboardModifiers.CAPS_LOCK, False)
self._assert_get_key(50, Key.UPPER_B, KeyboardModifiers.CAPS_LOCK, False)
self._assert_get_key(20, Key.CAPS_LOCK, KeyboardModifiers.NONE, True)
self._assert_get_key(240, None, KeyboardModifiers.NONE, False)
self._assert_get_key(20, None, KeyboardModifiers.NONE, False)
self._assert_get_key(33, Key.LOWER_C, KeyboardModifiers.NONE, False)
def test_caps_lock_and_shift(self):
self._assert_get_key(28, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(20, Key.CAPS_LOCK, KeyboardModifiers.CAPS_LOCK, True)
self._assert_get_key(240, None, KeyboardModifiers.CAPS_LOCK, False)
self._assert_get_key(20, None, KeyboardModifiers.CAPS_LOCK, False)
self._assert_get_key(50, Key.UPPER_B, KeyboardModifiers.CAPS_LOCK, False)
self._assert_get_key(18, Key.LEFT_SHIFT, KeyboardModifiers.CAPS_LOCK | KeyboardModifiers.LEFT_SHIFT, True)
self._assert_get_key(33, Key.LOWER_C, KeyboardModifiers.CAPS_LOCK | KeyboardModifiers.LEFT_SHIFT, False)
self._assert_get_key(240, None, KeyboardModifiers.CAPS_LOCK | KeyboardModifiers.LEFT_SHIFT, False)
self._assert_get_key(18, None, KeyboardModifiers.CAPS_LOCK, True)
self._assert_get_key(35, Key.UPPER_D, KeyboardModifiers.CAPS_LOCK, False)
self._assert_get_key(20, Key.CAPS_LOCK, KeyboardModifiers.NONE, True)
self._assert_get_key(240, None, KeyboardModifiers.NONE, False)
self._assert_get_key(20, None, KeyboardModifiers.NONE, False)
self._assert_get_key(36, Key.LOWER_E, KeyboardModifiers.NONE, False)
def _assert_get_key(self, scan_code, key, modifiers, modifiers_changed):
self.assertEqual(self.keyboard.get_key(scan_code), (key, modifiers, modifiers_changed))
class KeyboardGetKeyMultipleModifierReleaseTestCase(unittest.TestCase):
def setUp(self):
self.keyboard = Keyboard(KEYMAP_3278_TYPEWRITER)
def test_single_modifier_release_is_false(self):
self.assertFalse(self.keyboard.single_modifier_release)
def test_default(self):
self._assert_get_key(96, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(97, Key.LOWER_B, KeyboardModifiers.NONE, False)
self._assert_get_key(98, Key.LOWER_C, KeyboardModifiers.NONE, False)
self._assert_get_key(99, Key.LOWER_D, KeyboardModifiers.NONE, False)
def test_shift(self):
self._assert_get_key(96, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(77, Key.LEFT_SHIFT, KeyboardModifiers.LEFT_SHIFT, True)
self._assert_get_key(97, Key.UPPER_B, KeyboardModifiers.LEFT_SHIFT, False)
self._assert_get_key(78, Key.RIGHT_SHIFT, KeyboardModifiers.LEFT_SHIFT | KeyboardModifiers.RIGHT_SHIFT, True)
self._assert_get_key(98, Key.UPPER_C, KeyboardModifiers.LEFT_SHIFT | KeyboardModifiers.RIGHT_SHIFT, False)
self._assert_get_key(205, None, KeyboardModifiers.RIGHT_SHIFT, True)
self._assert_get_key(99, Key.UPPER_D, KeyboardModifiers.RIGHT_SHIFT, False)
self._assert_get_key(206, None, KeyboardModifiers.NONE, True)
self._assert_get_key(100, Key.LOWER_E, KeyboardModifiers.NONE, False)
# TODO... include the additional ALT reset scan_code!
def test_mapped_alt(self):
self._assert_get_key(96, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(79, Key.RIGHT_ALT, KeyboardModifiers.RIGHT_ALT, True)
self._assert_get_key(33, Key.PF1, KeyboardModifiers.RIGHT_ALT, False)
self._assert_get_key(207, None, KeyboardModifiers.NONE, True)
self._assert_get_key(98, Key.LOWER_C, KeyboardModifiers.NONE, False)
def test_unmapped_alt(self):
self._assert_get_key(96, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(79, Key.RIGHT_ALT, KeyboardModifiers.RIGHT_ALT, True)
self._assert_get_key(97, Key.LOWER_B, KeyboardModifiers.RIGHT_ALT, False)
self._assert_get_key(207, None, KeyboardModifiers.NONE, True)
self._assert_get_key(98, Key.LOWER_C, KeyboardModifiers.NONE, False)
def test_alt_and_shift(self):
self._assert_get_key(96, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(79, Key.RIGHT_ALT, KeyboardModifiers.RIGHT_ALT, True)
self._assert_get_key(97, Key.LOWER_B, KeyboardModifiers.RIGHT_ALT, False)
self._assert_get_key(77, Key.LEFT_SHIFT, KeyboardModifiers.RIGHT_ALT | KeyboardModifiers.LEFT_SHIFT, True)
self._assert_get_key(98, Key.UPPER_C, KeyboardModifiers.RIGHT_ALT | KeyboardModifiers.LEFT_SHIFT, False)
self._assert_get_key(205, None, KeyboardModifiers.RIGHT_ALT, True)
self._assert_get_key(99, Key.LOWER_D, KeyboardModifiers.RIGHT_ALT, False)
self._assert_get_key(207, None, KeyboardModifiers.NONE, True)
self._assert_get_key(100, Key.LOWER_E, KeyboardModifiers.NONE, False)
def test_caps_lock(self):
self._assert_get_key(96, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(76, Key.CAPS_LOCK, KeyboardModifiers.CAPS_LOCK, True)
self._assert_get_key(204, None, KeyboardModifiers.CAPS_LOCK, False)
self._assert_get_key(97, Key.UPPER_B, KeyboardModifiers.CAPS_LOCK, False)
self._assert_get_key(76, Key.CAPS_LOCK, KeyboardModifiers.NONE, True)
self._assert_get_key(204, None, KeyboardModifiers.NONE, False)
self._assert_get_key(98, Key.LOWER_C, KeyboardModifiers.NONE, False)
def test_caps_lock_and_shift(self):
self._assert_get_key(96, Key.LOWER_A, KeyboardModifiers.NONE, False)
self._assert_get_key(76, Key.CAPS_LOCK, KeyboardModifiers.CAPS_LOCK, True)
self._assert_get_key(204, None, KeyboardModifiers.CAPS_LOCK, False)
self._assert_get_key(97, Key.UPPER_B, KeyboardModifiers.CAPS_LOCK, False)
self._assert_get_key(77, Key.LEFT_SHIFT, KeyboardModifiers.CAPS_LOCK | KeyboardModifiers.LEFT_SHIFT, True)
self._assert_get_key(98, Key.LOWER_C, KeyboardModifiers.CAPS_LOCK | KeyboardModifiers.LEFT_SHIFT, False)
self._assert_get_key(205, None, KeyboardModifiers.CAPS_LOCK, True)
self._assert_get_key(99, Key.UPPER_D, KeyboardModifiers.CAPS_LOCK, False)
self._assert_get_key(76, Key.CAPS_LOCK, KeyboardModifiers.NONE, True)
self._assert_get_key(204, None, KeyboardModifiers.NONE, False)
self._assert_get_key(100, Key.LOWER_E, KeyboardModifiers.NONE, False)
def _assert_get_key(self, scan_code, key, modifiers, modifiers_changed):
self.assertEqual(self.keyboard.get_key(scan_code), (key, modifiers, modifiers_changed))
class GetCharacterForKeyTestCase(unittest.TestCase):
def test_none(self):
self.assertIsNone(get_character_for_key(None))
def test_no_mapping(self):
self.assertIsNone(get_character_for_key(Key.ATTN))
def test_mapping(self):
self.assertEqual(get_character_for_key(Key.UPPER_A), 'A')