File: test_events.py

package info (click to toggle)
python-curtsies 0.4.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 420 kB
  • sloc: python: 4,021; sh: 6; makefile: 5
file content (147 lines) | stat: -rw-r--r-- 5,122 bytes parent folder | download | duplicates (2)
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")