summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <git@the-compiler.org>2018-03-06 06:29:03 +0100
committerFlorian Bruhin <git@the-compiler.org>2018-03-06 06:29:38 +0100
commit41dfa296483954e3f4eaf3285b9688b318211861 (patch)
tree07eea6e9de437ed072fec5b27ad945ef0535e19d
parent7a9f8fda72797f5cd075f37c6b884917be721d55 (diff)
downloadqutebrowser-41dfa296483954e3f4eaf3285b9688b318211861.tar.gz
qutebrowser-41dfa296483954e3f4eaf3285b9688b318211861.zip
Improve parsing of invalid keys
This should handle "<>" and "\x1f" correctly.
-rw-r--r--qutebrowser/keyinput/keyutils.py8
-rw-r--r--tests/unit/keyinput/test_keyutils.py18
2 files changed, 17 insertions, 9 deletions
diff --git a/qutebrowser/keyinput/keyutils.py b/qutebrowser/keyinput/keyutils.py
index fd00cf5b5..91d6a36a3 100644
--- a/qutebrowser/keyinput/keyutils.py
+++ b/qutebrowser/keyinput/keyutils.py
@@ -413,12 +413,12 @@ class KeySequence:
def _validate(self, keystr=None):
for info in self:
- assert Qt.Key_Space <= info.key <= Qt.Key_unknown, info.key
- if info.key == Qt.Key_unknown:
- raise KeyParseError(keystr, "Got unknown key!")
+ if info.key < Qt.Key_Space or info.key >= Qt.Key_unknown:
+ raise KeyParseError(keystr, "Got invalid key!")
for seq in self._sequences:
- assert seq
+ if not seq:
+ raise KeyParseError(keystr, "Got invalid key!")
def matches(self, other):
"""Check whether the given KeySequence matches with this one.
diff --git a/tests/unit/keyinput/test_keyutils.py b/tests/unit/keyinput/test_keyutils.py
index 97c9da04c..11dd41b1f 100644
--- a/tests/unit/keyinput/test_keyutils.py
+++ b/tests/unit/keyinput/test_keyutils.py
@@ -19,6 +19,8 @@
import operator
+import hypothesis
+from hypothesis import strategies
import pytest
from PyQt5.QtCore import Qt, QEvent, pyqtSignal
from PyQt5.QtGui import QKeyEvent, QKeySequence
@@ -203,15 +205,11 @@ class TestKeySequence:
seq = keyutils.KeySequence()
assert not seq
- @pytest.mark.parametrize('key', [Qt.Key_unknown, -1])
+ @pytest.mark.parametrize('key', [Qt.Key_unknown, -1, '\x1f', 0])
def test_init_unknown(self, key):
with pytest.raises(keyutils.KeyParseError):
keyutils.KeySequence(key)
- def test_init_invalid(self):
- with pytest.raises(AssertionError):
- keyutils.KeySequence(0)
-
@pytest.mark.parametrize('orig, normalized', [
('<Control+x>', '<Ctrl+x>'),
('<Windows+x>', '<Meta+x>'),
@@ -410,6 +408,7 @@ class TestKeySequence:
('<alt+<>', keyutils.KeyParseError),
('<alt+>>', keyutils.KeyParseError),
('<blub>', keyutils.KeyParseError),
+ ('<>', keyutils.KeyParseError),
('\U00010000', keyutils.KeyParseError),
])
def test_parse(self, keystr, expected):
@@ -419,6 +418,15 @@ class TestKeySequence:
else:
assert keyutils.KeySequence.parse(keystr) == expected
+ @hypothesis.given(strategies.text())
+ def test_parse_hypothesis(self, keystr):
+ try:
+ seq = keyutils.KeySequence.parse(keystr)
+ except keyutils.KeyParseError:
+ pass
+ else:
+ str(seq)
+
def test_key_info_from_event():
ev = QKeyEvent(QEvent.KeyPress, Qt.Key_A, Qt.ShiftModifier, 'A')