1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
import unittest
from functools import partial
from curtsies import events
class TestChrByte(unittest.TestCase):
def test_simple(self):
"""0-255 can be turned into bytes"""
for i in range(256):
s = eval('b"\\x%s"' % ("0" + hex(i)[2:])[-2:])
self.assertEqual(s, events.chr_byte(i))
def test_helpers(self):
self.assertEqual(events.chr_byte(97), b"a")
self.assertEqual(events.chr_uni(97), "a")
class TestCurtsiesNames(unittest.TestCase):
def spot_check(self):
self.assertEqual(events.CURTSIES_NAMES[b"\x1b\x08"], "<Esc+Ctrl-H>")
self.assertEqual(events.CURTSIES_NAMES[b"\x00"], "<Ctrl-SPACE>")
self.assertEqual(events.CURTSIES_NAMES[b"\xea"], "<Meta-j>")
def test_all_values_unicode(self):
for seq, e in events.CURTSIES_NAMES.items():
self.assertEqual(type(seq), bytes)
def test_all_keys_bytes(self):
for seq, e in events.CURTSIES_NAMES.items():
self.assertEqual(type(e), str)
class TestDecodable(unittest.TestCase):
def test_simple(self):
self.assertTrue(events.decodable(b"d", "utf-8"))
self.assertFalse(events.decodable(b"\xfe", "utf-8")) # 254 is off limits
class TestGetKey(unittest.TestCase):
def test_utf8_full(self):
get_utf_full = partial(
events.get_key,
encoding="utf-8",
keynames=events.Keynames.CURTSIES,
full=True,
)
self.assertEqual(get_utf_full([b"h"]), "h")
self.assertEqual(get_utf_full([b"\x1b", b"["]), "<Esc+[>")
self.assertRaises(UnicodeDecodeError, get_utf_full, [b"\xfe\xfe"])
self.assertRaises(TypeError, get_utf_full, "a")
def test_utf8(self):
get_utf = partial(
events.get_key,
encoding="utf-8",
keynames=events.Keynames.CURTSIES,
full=False,
)
self.assertEqual(get_utf([b"h"]), "h")
self.assertEqual(get_utf([b"\x1b", b"["]), None)
self.assertEqual(get_utf([b"\xe2"]), None)
self.assertRaises(TypeError, get_utf, "a")
def test_multibyte_utf8(self):
get_utf = partial(
events.get_key,
encoding="utf-8",
keynames=events.Keynames.CURTSIES,
full=False,
)
self.assertEqual(get_utf([b"\xc3"]), None)
self.assertEqual(get_utf([b"\xe2"]), None)
self.assertEqual(get_utf([b"\xe2"], full=True), "<Meta-b>")
self.assertEqual(get_utf([b"\xc3", b"\x9f"]), "ß")
self.assertEqual(get_utf([b"\xe2"]), None)
self.assertEqual(get_utf([b"\xe2", b"\x88"]), None)
self.assertEqual(get_utf([b"\xe2", b"\x88", b"\x82"]), "∂")
def test_sequences_without_names(self):
get_utf = partial(
events.get_key,
encoding="utf-8",
keynames=events.Keynames.CURTSIES,
full=False,
)
self.assertEqual(get_utf([b"\xc3"], full=True), "<Meta-C>")
self.assertEqual(
get_utf([b"\xc3"], full=True, keynames=events.Keynames.CURSES), "xC3"
)
def test_key_names(self):
"Every key sequence with a Curses name should have a Curtsies name too."
self.assertTrue(
set(events.CURTSIES_NAMES).issuperset(set(events.CURSES_NAMES)),
set(events.CURSES_NAMES) - set(events.CURTSIES_NAMES),
)
class TestGetKeyAscii(unittest.TestCase):
def test_full(self):
get_ascii_full = partial(
events.get_key,
encoding="ascii",
keynames=events.Keynames.CURTSIES,
full=True,
)
self.assertEqual(get_ascii_full([b"a"]), "a")
self.assertEqual(get_ascii_full([b"\xe1"]), "<Meta-a>")
self.assertEqual(
get_ascii_full([b"\xe1"], keynames=events.Keynames.CURSES), "xE1"
)
def test_simple(self):
get_ascii_full = partial(
events.get_key, encoding="ascii", keynames=events.Keynames.CURTSIES
)
self.assertEqual(get_ascii_full([b"a"]), "a")
self.assertEqual(get_ascii_full([b"\xe1"]), "<Meta-a>")
self.assertEqual(
get_ascii_full([b"\xe1"], keynames=events.Keynames.CURSES), "xE1"
)
class TestUnknownEncoding(unittest.TestCase):
def test_simple(self):
get_utf16 = partial(
events.get_key, encoding="utf16", keynames=events.Keynames.CURTSIES
)
self.assertEqual(get_utf16([b"a"]), None)
self.assertEqual(get_utf16([b"a"], full=True), None)
self.assertEqual(get_utf16([b"\xe1"]), None)
self.assertEqual(get_utf16([b"\xe1"], full=True), "<Meta-a>")
class TestSpecialKeys(unittest.TestCase):
def test_simple(self):
seq = [b"\x1b", b"[", b"1", b";", b"9", b"C"]
self.assertEqual(
[events.get_key(seq[:i], encoding="utf8") for i in range(1, len(seq) + 1)],
[None, None, None, None, None, "<Esc+RIGHT>"],
)
class TestPPEvent(unittest.TestCase):
def test(self):
self.assertEqual(events.pp_event("a"), "a")
|