Skip to content

Commit

Permalink
test: simplify testing of different keys
Browse files Browse the repository at this point in the history
  • Loading branch information
askalt committed Jul 18, 2023
1 parent def9356 commit 6bc13bd
Showing 1 changed file with 95 additions and 69 deletions.
164 changes: 95 additions & 69 deletions test/integration/prompt/test_prompt.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,45 @@
import pytest

DEFAULT_KEYS = {
"Left": "Left",
"Right": "Right",
"Erase": "BSpace",
"Enter": "Enter",
"Up": "Up",
"Down": "Down",
"C-r": "C-r",
"Home": "Home",
"End": "End",
"M-b": "M-b",
"M-f": "M-f",
}

EMACS_KEYS = {
"Left": "C-b",
"Right": "C-f",
"Erase": "C-h",
"Enter": "C-m",
"Up": "C-p",
"Down": "C-n",
"C-r": "C-r",
"Home": "c-a",
"End": "c-e",
"M-b": "M-b",
"M-f": "M-f",
}


def test_launch(prompt):
assert prompt.get_cursor() == (12, 0)
assert prompt.dump_workspace() == "prompt_app>"


def test_input_text(prompt):
@pytest.mark.parametrize("keys", [DEFAULT_KEYS, EMACS_KEYS])
def test_input_text(prompt, keys):
prompt.send_keys("cmd")
assert (15, 0) == prompt.get_cursor()

prompt.send_keys("Enter")
prompt.send_keys(keys["Enter"])
assert (12, 2) == prompt.get_cursor()

prompt.send_keys("русский язык")
Expand All @@ -23,57 +52,53 @@ def test_input_text(prompt):
assert prompt.dump_workspace() == expected


@pytest.mark.parametrize("erase_key", ["C-h", "BSpace"])
def test_remove_text(prompt, erase_key):
@pytest.mark.parametrize("keys", [DEFAULT_KEYS, EMACS_KEYS])
def test_remove_text(prompt, keys):
prompt.send_keys("##### e хай hello")
prompt.send_keys(["Left"] * 9)
prompt.send_keys([erase_key] * 7)
prompt.send_keys([keys["Left"]] * 9)
prompt.send_keys([keys["Erase"]] * 7)
assert prompt.get_cursor() == (13, 0)

expected = "prompt_app> #хай hello"
assert prompt.dump_workspace() == expected

prompt.send_keys([erase_key] * 2)
prompt.send_keys([keys["Erase"]] * 2)
assert prompt.get_cursor() == (12, 0)
expected2 = "prompt_app> хай hello"
assert prompt.dump_workspace() == expected2


@pytest.mark.parametrize("left_key, right_key", [
pytest.param("Left", "Right"),
pytest.param("C-b", "C-f") # emacs
])
def test_move_over_input(prompt, left_key, right_key):
@pytest.mark.parametrize("keys", [DEFAULT_KEYS, EMACS_KEYS])
def test_move_over_input(prompt, keys):
prompt.send_keys("hello!")
prompt.send_keys([left_key] * 2)
prompt.send_keys([keys["Left"]] * 2)
assert prompt.get_cursor() == (16, 0)

prompt.send_keys([left_key] * 10)
prompt.send_keys([keys["Left"]] * 10)
assert prompt.get_cursor() == (12, 0)

prompt.send_keys([right_key] * 7)
prompt.send_keys([keys["Right"]] * 7)
assert prompt.get_cursor() == (18, 0)

prompt.send_keys("слово")
prompt.send_keys([left_key] * 3)
prompt.send_keys([keys["Left"]] * 3)
assert prompt.get_cursor() == (20, 0)

expected = "prompt_app> hello!слово"
assert prompt.dump_workspace() == expected


@pytest.mark.parametrize("left_key", ["Left", "C-b"])
@pytest.mark.parametrize("erase_key", ["BSpace", "C-h"])
@pytest.mark.parametrize("keys", [DEFAULT_KEYS, EMACS_KEYS])
@pytest.mark.parametrize("prompt", [{"x": "100"}], indirect=True)
def test_multiline_commands(prompt, left_key, erase_key):
def test_multiline_commands(prompt, keys):
prompt.send_keys("строка1\nline2\nline3a")
assert prompt.get_cursor() == (6, 2)

prompt.send_keys([left_key] * 7)
prompt.send_keys([keys["Left"]] * 7)
assert prompt.get_cursor() == (5, 1)

prompt.send_keys([left_key] * 4)
prompt.send_keys([erase_key] * 2)
prompt.send_keys([keys["Left"]] * 4)
prompt.send_keys([keys["Erase"]] * 2)
assert prompt.get_cursor() == (19, 0)

expected = """prompt_app> строка1ine2
Expand All @@ -88,14 +113,15 @@ def test_multiline_commands(prompt, left_key, erase_key):
assert prompt.dump_workspace() == expected


def test_enter(prompt):
@pytest.mark.parametrize("keys", [DEFAULT_KEYS, EMACS_KEYS])
def test_enter(prompt, keys):
pipeline = [
"one line cmd",
"Enter",
keys["Enter"],
"строка1\nстрока2aa",
"Enter",
keys["Enter"],
"бессовестно\nмного\nстрокЖ",
"Enter"
keys["Enter"]
]
for cmd in pipeline:
prompt.send_keys(cmd)
Expand Down Expand Up @@ -132,20 +158,21 @@ def test_enter(prompt):
HISTORY_ARG = ";".join(HISTORY)


@pytest.mark.parametrize("keys", [DEFAULT_KEYS, EMACS_KEYS])
@pytest.mark.parametrize("prompt", [{"args": [HISTORY_ARG]}], indirect=True)
def test_move_history(prompt):
def test_move_history(prompt, keys):
history_rev = HISTORY.copy()
history_rev.reverse()

# Up.
for entry in history_rev:
prompt.send_keys("Up")
prompt.send_keys(keys["Up"])
expected = "prompt_app> " + entry
assert prompt.dump_workspace() == expected

# Down.
for i in range(1, len(HISTORY)):
prompt.send_keys("Down")
prompt.send_keys(keys["Down"])
expected = "prompt_app> " + HISTORY[i]
assert prompt.dump_workspace() == expected

Expand All @@ -154,20 +181,21 @@ def test_move_history(prompt):

# Up.
for entry in history_rev:
prompt.send_keys("Up")
prompt.send_keys(keys["Up"])
expected = "prompt_app> " + entry
assert prompt.dump_workspace() == expected

# Down.
for i in range(1, len(HISTORY)):
prompt.send_keys("Down")
prompt.send_keys(keys["Down"])
expected = "prompt_app> " + HISTORY[i]
assert prompt.dump_workspace() == expected


@pytest.mark.parametrize("keys", [DEFAULT_KEYS, EMACS_KEYS])
@pytest.mark.parametrize("prompt", [{"args": [HISTORY_ARG]}], indirect=True)
def test_enter_history(prompt):
prompt.send_keys(["Up", "Up", "Enter"])
def test_enter_history(prompt, keys):
prompt.send_keys([keys["Up"], keys["Up"], keys["Enter"]])

expected = """prompt_app> if a then
print(x)
Expand All @@ -181,9 +209,10 @@ def test_enter_history(prompt):
assert prompt.dump_workspace() == expected


@pytest.mark.parametrize("keys", [DEFAULT_KEYS, EMACS_KEYS])
@pytest.mark.parametrize("prompt", [{"args": [HISTORY_ARG]}], indirect=True)
def test_reverse_search(prompt):
prompt.send_keys(["Some-текст", "C-r"])
def test_reverse_search(prompt, keys):
prompt.send_keys(["Some-текст", keys["C-r"]])
expected = """(reverse-i-search)`':Some-текст"""
assert prompt.dump_workspace() == expected

Expand All @@ -194,37 +223,38 @@ def test_reverse_search(prompt):
print(y)"""
assert prompt.dump_workspace() == expected

prompt.send_keys(["C-r"])
prompt.send_keys(keys["C-r"])
expected = """(reverse-i-search)`print(':print(D)"""
assert prompt.dump_workspace() == expected

prompt.send_keys(["C-r"])
prompt.send_keys(keys["C-r"])
expected = """(reverse-i-search)`print(':print(C)"""
assert prompt.dump_workspace() == expected

prompt.send_keys(["Left"])
prompt.send_keys(keys["Left"])
expected = """prompt_app> print(C)"""
assert prompt.dump_workspace() == expected

# Check that we are at the past.
for i in range(1, len(HISTORY)):
prompt.send_keys(["Down"])
prompt.send_keys(keys["Down"])
expected = "prompt_app> " + HISTORY[i]
assert prompt.dump_workspace() == expected

prompt.send_keys(["C-r", "not matched with any"])
prompt.send_keys(["C-r", "C-r", "C-r"])
prompt.send_keys([keys["C-r"], "not matched with any"])
prompt.send_keys([keys["C-r"], keys["C-r"], keys["C-r"]])
expected = """(failed reverse-i-search)`not matched with any':"""
assert prompt.dump_workspace() == expected

prompt.send_keys(["Up"])
prompt.send_keys(keys["Up"])
expected = """prompt_app>"""
assert prompt.dump_workspace() == expected


@pytest.mark.parametrize("keys", [DEFAULT_KEYS, EMACS_KEYS])
@pytest.mark.parametrize("prompt", [{"args": [HISTORY_ARG]}], indirect=True)
def test_enter_reverse_search(prompt):
prompt.send_keys(["C-r", "print(", "Enter"])
def test_enter_reverse_search(prompt, keys):
prompt.send_keys(["C-r", "print(", keys["Enter"]])
expected = """prompt_app> if a then
print(x)
else
Expand All @@ -237,17 +267,18 @@ def test_enter_reverse_search(prompt):
assert prompt.dump_workspace() == expected


@pytest.mark.parametrize("keys", [DEFAULT_KEYS, EMACS_KEYS])
@pytest.mark.parametrize(
"prompt",
[{"args": ["if 1\tprint(2)else\tprint(3)"]}],
indirect=True
)
def test_tabs(prompt):
def test_tabs(prompt, keys):
prompt.send_keys("Hello,\tпривет,\ttabs")
assert prompt.get_cursor() == (37, 0)
assert prompt.dump_workspace() == "prompt_app> Hello, привет, tabs"

prompt.send_keys("Up")
prompt.send_keys(keys["Up"])
expected = "prompt_app> if 1 print(2)else print(3)"
assert prompt.dump_workspace() == expected

Expand All @@ -258,27 +289,24 @@ def test_console_not_broken(prompt):
assert prompt.dump_workspace() == expected


@pytest.mark.parametrize("home_key, end_key", [
pytest.param("Home", "End"),
pytest.param("C-a", "C-e"), # emacs
])
def test_home_end_keys(prompt, home_key, end_key):
@pytest.mark.parametrize("keys", [DEFAULT_KEYS, EMACS_KEYS])
def test_home_end_keys(prompt, keys):
cmd = """здравствуй,
nebo
в облаках"""
prompt.send_keys(cmd)
assert prompt.get_cursor() == (9, 2)

prompt.send_keys(home_key)
prompt.send_keys(keys["Home"])
assert prompt.get_cursor() == (12, 0)

prompt.send_keys(["Right"] * 7 + [home_key])
prompt.send_keys(["Right"] * 7 + [keys["Home"]])
assert prompt.get_cursor() == (12, 0)

prompt.send_keys(end_key)
prompt.send_keys(keys["End"])
assert prompt.get_cursor() == (9, 2)

prompt.send_keys(["Left"] * 9 + [end_key])
prompt.send_keys(["Left"] * 9 + [keys["End"]])
assert prompt.get_cursor() == (9, 2)

prompt.send_keys(["\n-текст"])
Expand All @@ -289,10 +317,8 @@ def test_home_end_keys(prompt, home_key, end_key):
assert prompt.dump_workspace() == expected


@pytest.mark.parametrize("word_left_key, word_right_key", [
pytest.param("M-b", "M-f")
])
def test_go_left_right_word(prompt, word_left_key, word_right_key):
@pytest.mark.parametrize("keys", [DEFAULT_KEYS, EMACS_KEYS])
def test_go_left_right_word(prompt, keys):
cmd = """a b c d
слово1 слово2 слово3 слово4
d
Expand All @@ -301,11 +327,11 @@ def test_go_left_right_word(prompt, word_left_key, word_right_key):
б"""
# Go left from the end.
cmds = [
[cmd, word_left_key],
word_left_key,
word_left_key,
["Left", "Left", word_left_key],
[word_left_key] * 6
[cmd, keys["M-b"]],
keys["M-b"],
keys["M-b"],
["Left", "Left", keys["M-b"]],
[ keys["M-b"]] * 6
]
cursors = [
(0, 5),
Expand All @@ -320,11 +346,11 @@ def test_go_left_right_word(prompt, word_left_key, word_right_key):

# Go right from the beginning.
cmds = [
word_right_key,
word_right_key,
[word_right_key] * 5,
["Right", "Right", word_right_key],
[word_right_key] * 2
keys["M-f"],
keys["M-f"],
[keys["M-f"]] * 5,
["Right", "Right", keys["M-f"]],
[keys["M-f"]] * 2
]
cursors = [
(13, 0),
Expand Down

0 comments on commit 6bc13bd

Please sign in to comment.