Skip to content

Commit f7097ec

Browse files
C0D3D3VCube707
authored andcommitted
linux: extended test suite
1 parent 994b758 commit f7097ec

File tree

5 files changed

+262
-0
lines changed

5 files changed

+262
-0
lines changed

tests/posix/conftest.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,45 @@
11
import pytest
22
import sys
33

4+
if sys.platform.startswith("linux"):
5+
import termios
6+
import tty
7+
48

59
# ignore all tests in this folder if not on linux
610
def pytest_ignore_collect(path, config):
711
if not sys.platform.startswith("linux"):
812
return True
913

14+
15+
@pytest.fixture
16+
def patched_stdin():
17+
class mocked_stdin:
18+
buffer = []
19+
20+
def push(self, string):
21+
for c in string:
22+
self.buffer.append(c)
23+
24+
def read(self, n):
25+
string = ""
26+
for i in range(n):
27+
string += self.buffer.pop(0)
28+
return string
29+
30+
def mock_tcgetattr(fd):
31+
return [0, 0, 0, 0, None, None, None]
32+
33+
def mock_tcsetattr(fd, TCSADRAIN, old_settings):
34+
return None
35+
36+
def mock_setraw(fd):
37+
return None
38+
39+
mock = mocked_stdin()
40+
with pytest.MonkeyPatch.context() as mp:
41+
mp.setattr(sys.stdin, "read", mock.read)
42+
mp.setattr(termios, "tcgetattr", mock_tcgetattr)
43+
mp.setattr(termios, "tcsetattr", mock_tcsetattr)
44+
mp.setattr(tty, "setraw", mock_setraw)
45+
yield mock

tests/posix/test_import.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import readchar
2+
3+
4+
def test_readcharImport():
5+
assert readchar.readchar == readchar._posix_read.readchar
6+
7+
8+
def test_readkeyImport():
9+
assert readchar.readkey == readchar._posix_read.readkey
10+
11+
12+
def test_keyImport():
13+
a = {k: v for k, v in vars(readchar.key).items() if not k.startswith("__")}
14+
del a["platform"]
15+
b = {k: v for k, v in vars(readchar._posix_key).items() if not k.startswith("__")}
16+
assert a == b

tests/posix/test_keys.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import pytest
2+
from readchar import key as keys
3+
4+
5+
defaultKeys = ["LF", "CR", "ENTER", "BACKSPACE", "SPACE", "ESC", "TAB"]
6+
CTRLkeys = [
7+
"CTRL_A",
8+
"CTRL_B",
9+
"CTRL_C",
10+
"CTRL_D",
11+
"CTRL_E",
12+
"CTRL_F",
13+
"CTRL_G",
14+
"CTRL_H",
15+
"CTRL_I",
16+
"CTRL_J",
17+
"CTRL_K",
18+
"CTRL_L",
19+
"CTRL_M",
20+
"CTRL_N",
21+
"CTRL_O",
22+
"CTRL_P",
23+
"CTRL_Q",
24+
"CTRL_R",
25+
"CTRL_S",
26+
"CTRL_T",
27+
"CTRL_U",
28+
"CTRL_V",
29+
"CTRL_W",
30+
"CTRL_X",
31+
"CTRL_Y",
32+
"CTRL_Z",
33+
]
34+
35+
36+
@pytest.mark.parametrize("key", defaultKeys + CTRLkeys)
37+
def test_defaultKeysExists(key):
38+
assert key in keys.__dict__
39+
40+
41+
@pytest.mark.parametrize("key", defaultKeys + CTRLkeys)
42+
def test_defaultKeysLength(key):
43+
assert 1 == len(keys.__dict__[key])
44+
45+
46+
len3_keys = ["UP", "DOWN", "LEFT", "RIGHT", "HOME", "END", "F1", "F2", "F3", "F4"]
47+
48+
49+
@pytest.mark.parametrize("key", len3_keys)
50+
def test_character_length_3_exists(key):
51+
assert key in keys.__dict__
52+
53+
54+
@pytest.mark.parametrize("key", len3_keys)
55+
def test_character_length_3_lenght(key):
56+
assert 3 == len(keys.__dict__[key])
57+
58+
59+
len4_keys = ["INSERT", "SUPR", "PAGE_UP", "PAGE_DOWN"]
60+
61+
62+
@pytest.mark.parametrize("key", len4_keys)
63+
def test_character_length_4_exists(key):
64+
assert key in keys.__dict__
65+
66+
67+
@pytest.mark.parametrize("key", len4_keys)
68+
def test_character_length_4_lenght(key):
69+
assert 4 == len(keys.__dict__[key])
70+
71+
72+
len5_keys = ["F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12"]
73+
74+
75+
@pytest.mark.parametrize("key", len5_keys)
76+
def test_character_length_5_exists(key):
77+
assert key in keys.__dict__
78+
79+
80+
@pytest.mark.parametrize("key", len5_keys)
81+
def test_character_length_5_lenght(key):
82+
assert 5 == len(keys.__dict__[key])

tests/posix/test_readchar.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import pytest
2+
from string import printable
3+
from readchar import readchar, key
4+
5+
6+
@pytest.mark.parametrize("c", printable)
7+
def test_printableCharacters(patched_stdin, c):
8+
patched_stdin.push(c)
9+
assert c == readchar()
10+
11+
12+
@pytest.mark.parametrize(
13+
["seq", "key"],
14+
[
15+
("\n", key.LF),
16+
("\n", key.ENTER),
17+
("\r", key.CR),
18+
("\x7f", key.BACKSPACE),
19+
("\x20", key.SPACE),
20+
("\x1b", key.ESC),
21+
("\t", key.TAB),
22+
],
23+
)
24+
def test_controlCharacters(seq, key, patched_stdin):
25+
patched_stdin.push(seq)
26+
assert key == readchar()
27+
28+
29+
@pytest.mark.parametrize(
30+
["seq", "key"],
31+
[
32+
("\x01", key.CTRL_A),
33+
("\x02", key.CTRL_B),
34+
("\x03", key.CTRL_C),
35+
("\x04", key.CTRL_D),
36+
("\x05", key.CTRL_E),
37+
("\x06", key.CTRL_F),
38+
("\x07", key.CTRL_G),
39+
("\x08", key.CTRL_H),
40+
("\x09", key.CTRL_I),
41+
("\x0a", key.CTRL_J),
42+
("\x0b", key.CTRL_K),
43+
("\x0c", key.CTRL_L),
44+
("\x0d", key.CTRL_M),
45+
("\x0e", key.CTRL_N),
46+
("\x0f", key.CTRL_O),
47+
("\x10", key.CTRL_P),
48+
("\x11", key.CTRL_Q),
49+
("\x12", key.CTRL_R),
50+
("\x13", key.CTRL_S),
51+
("\x14", key.CTRL_T),
52+
("\x15", key.CTRL_U),
53+
("\x16", key.CTRL_V),
54+
("\x17", key.CTRL_W),
55+
("\x18", key.CTRL_X),
56+
("\x19", key.CTRL_Y),
57+
("\x1a", key.CTRL_Z),
58+
],
59+
)
60+
def test_CTRL_Characters(seq, key, patched_stdin):
61+
patched_stdin.push(seq)
62+
assert key == readchar()

tests/posix/test_readkey.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import pytest
2+
from readchar import readkey, key
3+
4+
5+
@pytest.mark.parametrize("key", ["\x03", key.CTRL_C])
6+
def test_KeyboardInterrupt(key, patched_stdin):
7+
patched_stdin.push(key)
8+
with pytest.raises(KeyboardInterrupt):
9+
readkey()
10+
11+
12+
def test_singleCharacter(patched_stdin):
13+
patched_stdin.push("a")
14+
assert "a" == readkey()
15+
16+
17+
@pytest.mark.parametrize(
18+
["seq", "key"],
19+
[
20+
("\x1b\x5b\x41", key.UP),
21+
("\x1b\x5b\x42", key.DOWN),
22+
("\x1b\x5b\x44", key.LEFT),
23+
("\x1b\x5b\x43", key.RIGHT),
24+
],
25+
)
26+
def test_cursorsKeys(seq, key, patched_stdin):
27+
patched_stdin.push(seq)
28+
assert key == readkey()
29+
30+
31+
@pytest.mark.parametrize(
32+
["seq", "key"],
33+
[
34+
("\x1b\x5b\x32\x7e", key.INSERT),
35+
("\x1b\x5b\x33\x7e", key.SUPR),
36+
("\x1b\x5b\x48", key.HOME),
37+
("\x1b\x5b\x46", key.END),
38+
("\x1b\x5b\x35\x7e", key.PAGE_UP),
39+
("\x1b\x5b\x36\x7e", key.PAGE_DOWN),
40+
],
41+
)
42+
def test_navigationKeys(seq, key, patched_stdin):
43+
patched_stdin.push(seq)
44+
assert key == readkey()
45+
46+
47+
@pytest.mark.parametrize(
48+
["seq", "key"],
49+
[
50+
(key.F1, "\x1b\x4f\x50"),
51+
(key.F2, "\x1b\x4f\x51"),
52+
(key.F3, "\x1b\x4f\x52"),
53+
(key.F4, "\x1b\x4f\x53"),
54+
(key.F5, "\x1b\x5b\x31\x35\x7e"),
55+
(key.F6, "\x1b\x5b\x31\x37\x7e"),
56+
(key.F7, "\x1b\x5b\x31\x38\x7e"),
57+
(key.F8, "\x1b\x5b\x31\x39\x7e"),
58+
(key.F9, "\x1b\x5b\x32\x30\x7e"),
59+
(key.F10, "\x1b\x5b\x32\x31\x7e"),
60+
(key.F11, "\x1b\x5b\x32\x33\x7e"),
61+
(key.F12, "\x1b\x5b\x32\x34\x7e"),
62+
],
63+
)
64+
def test_functionKeys(seq, key, patched_stdin):
65+
patched_stdin.push(seq)
66+
assert key == readkey()

0 commit comments

Comments
 (0)