commit ca40fdc56912088a424f9a0bd750caf9dc0b105b
Author: Kornel Benko <[email protected]>
Date: Sat May 27 11:09:26 2017 +0200
keytests: Add a small delay to each special key
keytest.py: This gives the os some time to update the status.
All keys with modifier and all possible shortcuts are affected.
Shortcut use corrected in findadv-11-in.txt and findadv-17-in.txt
---
development/autotests/bug-8482-in.txt | 3 +
development/autotests/findadv-08-in.txt | 4 +-
development/autotests/findadv-11-in.txt | 2 +-
development/autotests/findadv-17-in.txt | 2 +-
development/autotests/keytest.py | 141 ++++++++++++++++---------------
5 files changed, 78 insertions(+), 74 deletions(-)
diff --git a/development/autotests/bug-8482-in.txt
b/development/autotests/bug-8482-in.txt
index 37bbb5a..ca974fb 100644
--- a/development/autotests/bug-8482-in.txt
+++ b/development/autotests/bug-8482-in.txt
@@ -4,7 +4,10 @@
# is cleared after the next test starts.
Lang en_US.utf8
+CO: bug-8482.ctrl
TestBegin -dbg key test.lyx > bug-8482.loga.txt 2>&1
KK: \Cm
+CP: Key (queried) [action=math-mode][Ctrl+M]
KK: \Ai
TestEnd
+Assert searchPatterns.pl base=bug-8482
diff --git a/development/autotests/findadv-08-in.txt
b/development/autotests/findadv-08-in.txt
index d392179..995ead3 100644
--- a/development/autotests/findadv-08-in.txt
+++ b/development/autotests/findadv-08-in.txt
@@ -24,13 +24,13 @@ KK: \[Escape]\C\[Home]\C\[F21]
KK: o
KK: \C\[F20]
KK: [\\w]* a
-KD: 100
+#KD: 100
# select whole words
KK: \Ae
# search next
KK: \Al
KK: \[Escape]
-KD: 1
+#KD: 1
Cr: ^.*Putting
CP: Putting selection at .*idx: 0 par: 1 pos: 26\n with len: 6
#
diff --git a/development/autotests/findadv-11-in.txt
b/development/autotests/findadv-11-in.txt
index 2dad3a4..3832475 100644
--- a/development/autotests/findadv-11-in.txt
+++ b/development/autotests/findadv-11-in.txt
@@ -19,7 +19,7 @@ KK: \[Escape]\C\[Home]
KK: \CF
KK: \[Delete]
# Uncheck ignore format
-KK: \At\Ai\Ah
+KK: \Az\Ag\Ae
KK: \Cm
KK: v\[Return]
CP: Putting selection at .*idx: 0 par: 0 pos: 0\n.*idx: 0 par: 0 pos:
0\n.*idx: 1 par: 0 pos: 0\n with len: 1
diff --git a/development/autotests/findadv-17-in.txt
b/development/autotests/findadv-17-in.txt
index 30d5d3c..3bf7a68 100644
--- a/development/autotests/findadv-17-in.txt
+++ b/development/autotests/findadv-17-in.txt
@@ -17,7 +17,7 @@ CP: Key (queried) [action=buffer-begin][Ctrl+Home]
KK: \CF
KK: \[Delete]
# Uncheck ignore format
-KK: \At\Ai\Ah
+KK: \Az\Ag\Ae
KK: \Cm\\beta\\alpha \[Return]
CP: Putting selection at .*idx: 0 par: 0 pos: 0\n.*idx: 0 par: 0 pos: 1\n with
len: 2
TestEnd
diff --git a/development/autotests/keytest.py b/development/autotests/keytest.py
index c5a84d0..f1c80c2 100755
--- a/development/autotests/keytest.py
+++ b/development/autotests/keytest.py
@@ -384,73 +384,76 @@ def sendKeystringLocal(keystr, LYX_PID):
subprocess.call(xvpar, stdout = FNULL, stderr = FNULL)
sys.stdout.flush()
-Axreg = re.compile(r'^(.*)\\Ax([^\\]*)(.*)$')
-returnreg = re.compile(r'(\\\[[A-Z][a-z0-9]+\])(.*)$')
-
-# recursive wrapper around sendKeystringLocal()
-# handling \Ax-entries
-def sendKeystringAx(line, LYX_PID):
- global key_delay
- saved_delay = key_delay
- m = Axreg.match(line)
+def extractmultiple(line, regex):
+ #print("extractmultiple " + line)
+ res = ["", ""]
+ m = regex.match(line)
if m:
- prefix = m.group(1)
- content = m.group(2)
- rest = m.group(3);
- if prefix != "":
- # since (.*) is greedy, check prefix for '\Ax' again
- sendKeystringAx(prefix, LYX_PID)
- sendKeystringLocal('\Ax', LYX_PID)
- time.sleep(0.1)
- m2 = returnreg.match(rest)
- if m2:
- line = m2.group(2)
- ctrlk = m2.group(1)
- key_delay = "1"
- sendKeystringLocal(content + ctrlk, LYX_PID)
- key_delay = saved_delay
- time.sleep(controlkey_delay)
- if line != "":
- sendKeystringLocal(line, LYX_PID)
+ chr = m.group(1)
+ if m.group(2) == "":
+ res[0] = chr
+ res[1] = ""
else:
- if content != "":
- sendKeystringLocal(content, LYX_PID)
- if rest != "":
- sendKeystringLocal(rest, LYX_PID)
+ norm = extractmultiple(m.group(2), regex)
+ res[0] = chr + norm[0]
+ res[1] = norm[1]
else:
- if line != "":
- sendKeystringLocal(line, LYX_PID)
-
-specialkeyreg = re.compile(r'(.+)(\\[AC]([a-zA-Z]|\\\[[A-Z][a-z0-9]+\]).*)$')
-# Split line at start of each meta or controll char
-
-def sendKeystringAC(line, LYX_PID):
- m = specialkeyreg.match(line)
+ res[0] = ""
+ res[1] = line
+ return res
+
+normal_re = re.compile(r'^([^\\]|\\\\)(.*)$')
+def extractnormal(line):
+ # collect non-special chars from start of line
+ return extractmultiple(line, normal_re)
+
+modifier_re = re.compile(r'^(\\[CAS])(.+)$')
+def extractmodifiers(line):
+ # collect modifiers like '\\A' at start of line
+ return extractmultiple(line, modifier_re)
+
+special_re = re.compile(r'^(\\\[[A-Z][a-z0-9]+\])(.*)$')
+def extractsingle(line):
+ # check for single key following a modifier
+ # either ascii like 'a'
+ # or special like '\[Return]'
+ res = [False, "", ""]
+ m = normal_re.match(line)
if m:
- first = m.group(1)
- second = m.group(2)
- sendKeystringAC(first, LYX_PID)
- sendKeystringAC(second, LYX_PID)
+ res[0] = False
+ res[1] = m.group(1)
+ res[2] = m.group(2)
else:
- sendKeystringAx(line, LYX_PID)
+ m = special_re.match(line)
+ if m:
+ res[0] = True
+ res[1] = m.group(1)
+ res[2] = m.group(2)
+ else:
+ die(1, "Undecodable key for line \'" + line + "\"")
+ return res
-controlkeyreg =
re.compile(r'^(.*\\\[[A-Z][a-z0-9]+\])(.*\\\[[A-Z][a-z0-9]+\])(.*)$')
-# Make sure, only one of \[Return], \[Tab], \[Down], \[Home] etc are in one
sent line
-# e.g. split the input line on each keysym
-def sendKeystringRT(line, LYX_PID):
- m = controlkeyreg.match(line)
- if m:
- first = m.group(1)
- second = m.group(2)
- third = m.group(3)
- sendKeystringRT(first, LYX_PID)
- time.sleep(controlkey_delay)
- sendKeystringRT(second, LYX_PID)
+def sendKeystring(line, LYX_PID):
+ if line == "":
+ return
+ normalchars = extractnormal(line)
+ line = normalchars[1]
+ if normalchars[0] != "":
+ sendKeystringLocal(normalchars[0], LYX_PID)
+ if line == "":
+ return
+ modchars = extractmodifiers(line)
+ line = modchars[1]
+ if line == "":
+ die(1, "Missing modified key")
+ modifiedchar = extractsingle(line)
+ line = modifiedchar[2]
+ special = modchars[0] != "" or modifiedchar[0]
+ sendKeystringLocal(modchars[0] + modifiedchar[1], LYX_PID)
+ if special:
+ # give the os time to update the status info (in /proc)
time.sleep(controlkey_delay)
- if third != "":
- sendKeystringRT(third, LYX_PID)
- else:
- sendKeystringAC(line, LYX_PID)
+ sendKeystring(line, LYX_PID)
def system_retry(num_retry, cmd):
i = 0
@@ -633,7 +636,7 @@ outfile = open(outfilename, 'w')
if not lyx_pid is None:
RaiseWindow()
# Next command is language dependent
- #sendKeystringRT("\Afn", lyx_pid)
+ #sendKeystring("\Afn", lyx_pid)
write_commands = True
failed = False
@@ -698,8 +701,7 @@ while not failed:
print('lyx_pid: ' + lyx_pid)
print('lyx_win: ' + lyx_window_name)
dead_expected = False
- sendKeystringLocal("\C\[Home]", lyx_pid)
- time.sleep(controlkey_delay)
+ sendKeystring("\C\[Home]", lyx_pid)
elif c[0:5] == 'Sleep':
print("Sleeping for " + c[6:] + " seconds")
time.sleep(float(c[6:]))
@@ -715,7 +717,7 @@ while not failed:
RaiseWindow()
elif c[0:4] == 'KK: ':
if lyx_exists():
- sendKeystringRT(c[4:], lyx_pid)
+ sendKeystring(c[4:], lyx_pid)
else:
##intr_system('killall lyx; sleep 2 ; killall -9 lyx')
if lyx_pid is None:
@@ -727,7 +729,7 @@ while not failed:
print('Setting DELAY to ' + key_delay)
elif c == 'Loop':
RaiseWindow()
- sendKeystringRT(ResetCommand, lyx_pid)
+ sendKeystring(ResetCommand, lyx_pid)
elif c[0:6] == 'Assert':
cmd = c[7:].rstrip()
result = intr_system(cmd, True)
@@ -742,7 +744,7 @@ while not failed:
else:
print(" ------------ Forcing kill of lyx instance: " +
str(lyx_pid) + " ------------")
# This line below is there only to allow lyx to update its log-file
- sendKeystringLocal("\[Escape]", lyx_pid)
+ sendKeystring("\[Escape]", lyx_pid)
dead_expected = True
while not lyx_dead(lyx_pid):
intr_system("kill -9 " + str(lyx_pid), True);
@@ -763,11 +765,10 @@ while not failed:
else:
print(" ------------ Forcing quit of lyx instance: " +
str(lyx_pid) + " ------------")
# \[Escape]+ should work as RESET focus to main window
- sendKeystringAx("\[Escape]\[Escape]\[Escape]\[Escape]", lyx_pid)
- time.sleep(controlkey_delay)
+ sendKeystring("\[Escape]\[Escape]\[Escape]\[Escape]", lyx_pid)
# now we should be outside any dialog
# and so the function lyx-quit should work
- sendKeystringLocal("\Cq", lyx_pid)
+ sendKeystring("\Cq", lyx_pid)
marked.dispatch('CP: action=lyx-quit')
marked.close()
time.sleep(0.5)
@@ -780,7 +781,7 @@ while not failed:
# causing a 'beep'
time.sleep(0.5)
# probably waiting for Save/Discard/Abort, we select 'Discard'
- sendKeystringRT("\[Tab]\[Return]", lyx_pid)
+ sendKeystring("\[Tab]\[Return]", lyx_pid)
lcount = 0
else:
lcount = 1