2021-11-28 06:38:31 +08:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
import signal
|
|
|
|
from pexpect_helper import SpawnedProc
|
|
|
|
|
|
|
|
sp = SpawnedProc()
|
|
|
|
send, sendline, sleep, expect_prompt, expect_re, expect_str = (
|
|
|
|
sp.send,
|
|
|
|
sp.sendline,
|
|
|
|
sp.sleep,
|
|
|
|
sp.expect_prompt,
|
|
|
|
sp.expect_re,
|
|
|
|
sp.expect_str,
|
|
|
|
)
|
|
|
|
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# Exclam to clear the commandline.
|
|
|
|
sendline(r"bind ! 'commandline \'\''")
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# A do-nothing function to ensure we don't inherit weird completions.
|
|
|
|
sendline(r"function foo; end")
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
sendline(r"cd (mktemp -d)")
|
|
|
|
expect_prompt()
|
|
|
|
|
2023-06-02 00:20:19 +08:00
|
|
|
|
2021-11-28 06:38:31 +08:00
|
|
|
# Helper function that sets the commandline to a glob,
|
|
|
|
# optionally moves the cursor back, tab completes, and then clears the commandline.
|
|
|
|
def tab_expand_glob(input, expected, move_cursor_back=0):
|
|
|
|
send(input)
|
|
|
|
if move_cursor_back > 0:
|
|
|
|
send("\x1b[D" * move_cursor_back)
|
|
|
|
expect_str(input)
|
|
|
|
sleep(0.1)
|
|
|
|
send("\t")
|
|
|
|
expect_str(expected)
|
|
|
|
send(r"!") # clears the commandline
|
|
|
|
|
|
|
|
|
|
|
|
# Don't report tab_expand_glob as the callsite since it is a helper.
|
|
|
|
tab_expand_glob.callsite_skip = True
|
|
|
|
|
|
|
|
sendline(r"touch aaa1 aaa2 aaa3")
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
tab_expand_glob(r"cat *", r"cat aaa1 aaa2 aaa3")
|
|
|
|
tab_expand_glob(r"cat *2", r"cat aaa2")
|
|
|
|
|
|
|
|
# Globs that fail to expand are left alone.
|
|
|
|
tab_expand_glob(r"cat qqq*", r"cat qqq*")
|
|
|
|
|
|
|
|
# Special characters in expanded globs are properly escaped.
|
|
|
|
sendline(r"touch bb\*bbQ cc\;ccQ")
|
|
|
|
expect_prompt()
|
|
|
|
tab_expand_glob(r"cat *Q", r"cat bb\*bbQ cc\;ccQ")
|
|
|
|
|
|
|
|
# Cases from #8593.
|
|
|
|
sendline(r"rm -Rf *; touch README.rst")
|
|
|
|
expect_prompt()
|
|
|
|
tab_expand_glob(r"cat R*", r"cat README.rst")
|
|
|
|
|
|
|
|
# Glob fails, so offer completion.
|
|
|
|
tab_expand_glob(r"cat *.r", r"cat *.rst")
|
|
|
|
tab_expand_glob(r"cat *.rst", r"cat README.rst")
|
|
|
|
|
|
|
|
sendline(r"mkdir benchmarks && mkdir benchmarks/somedir && touch benchmarks/somefile")
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
tab_expand_glob(r"echo benchmarks/*", r"echo benchmarks/somedir benchmarks/somefile")
|
|
|
|
|
|
|
|
# Trailing slash suppresses files.
|
|
|
|
# Note we move the cursor backwards one, to right after the glob.
|
|
|
|
tab_expand_glob(r"echo benchmarks/*/", r"echo benchmarks/somedir/", 1)
|
|
|
|
|
|
|
|
# Glob fails so it tries completions which also fails.
|
|
|
|
# This happens whether the cursor is at the end, or just after the glob.
|
|
|
|
tab_expand_glob(r"echo ben*/nomatch", r"echo ben*/nomatch")
|
|
|
|
tab_expand_glob(r"echo ben*/nomatch", r"echo ben*/nomatch", len("/nomatch"))
|
|
|
|
|
|
|
|
# Glob fails so it tries completions which succeeds.
|
|
|
|
tab_expand_glob(r"echo ben*/somed", r"echo ben*/somedir")
|
|
|
|
tab_expand_glob(r"echo ben*/somed", r"echo ben*/somedir", len("/somed"))
|
|
|
|
|
|
|
|
# No glob in "current path component," offer completions.
|
|
|
|
tab_expand_glob(r"echo {benchmarks/*/,benchm}a", r"echo {benchmarks/*/,benchm}arks/")
|
|
|
|
|
|
|
|
# Test undo and redo.
|
|
|
|
# "<" and ">" to undo and redo respectively.
|
|
|
|
sendline(r"bind \< undo; bind \> redo")
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
send(r"echo benchmarks/*")
|
|
|
|
sleep(0.1)
|
|
|
|
send("\t")
|
|
|
|
expect_str(r"echo benchmarks/somedir benchmarks/somefile")
|
|
|
|
|
|
|
|
# Undo un-expands the command.
|
|
|
|
send(r"<")
|
|
|
|
expect_str(r"echo benchmarks/*")
|
|
|
|
|
|
|
|
# Redo re-expands it.
|
|
|
|
send(r">")
|
|
|
|
expect_str(r"echo benchmarks/somedir benchmarks/somefile")
|