diff --git a/tests/integration/data/caret.html b/tests/integration/data/caret.html new file mode 100644 index 000000000..b704d2a83 --- /dev/null +++ b/tests/integration/data/caret.html @@ -0,0 +1,11 @@ + + + + + Caret mode + + +

one two three
eins zwei drei

+

four five six
vier fünf sechs

+ + diff --git a/tests/integration/features/caret.feature b/tests/integration/features/caret.feature new file mode 100644 index 000000000..79faae189 --- /dev/null +++ b/tests/integration/features/caret.feature @@ -0,0 +1,260 @@ +Feature: Caret mode + In caret mode, the user can select and yank text using the keyboard. + + Background: + Given I open data/caret.html + And I run :enter-mode caret + + # document + + Scenario: Selecting the entire document + When I run :toggle-selection + And I run :move-to-end-of-document + And I run :yank-selected + Then the clipboard should contain: + one two three + eins zwei drei + + four five six + vier fünf sechs + + Scenario: Moving to end and to start of document + When I run :move-to-end-of-document + And I run :move-to-start-of-document + And I run :toggle-selection + And I run :move-to-end-of-word + And I run :yank-selected + Then the clipboard should contain "one" + + Scenario: Moving to end and to start of document (with selection) + When I run :move-to-end-of-document + And I run :toggle-selection + And I run :move-to-start-of-document + And I run :yank-selected + Then the clipboard should contain: + one two three + eins zwei drei + + four five six + vier fünf sechs + + # block + + Scenario: Selecting a block + When I run :toggle-selection + And I run :move-to-end-of-next-block + And I run :yank-selected + Then the clipboard should contain: + one two three + eins zwei drei + + Scenario: Moving back to the end of previous block (with selection) + When I run :move-to-end-of-next-block with count 2 + And I run :toggle-selection + And I run :move-to-end-of-prev-block + And I run :move-to-prev-word + And I run :yank-selected + Then the clipboard should contain: + drei + + four five six + + Scenario: Moving back to the end of previous block + When I run :move-to-end-of-next-block with count 2 + And I run :move-to-end-of-prev-block + And I run :toggle-selection + And I run :move-to-prev-word + And I run :yank-selected + Then the clipboard should contain "drei" + + Scenario: Moving back to the start of previous block (with selection) + When I run :move-to-end-of-next-block with count 2 + And I run :toggle-selection + And I run :move-to-start-of-prev-block + And I run :yank-selected + Then the clipboard should contain: + eins zwei drei + + four five six + + Scenario: Moving back to the start of previous block + When I run :move-to-end-of-next-block with count 2 + And I run :move-to-start-of-prev-block + And I run :toggle-selection + And I run :move-to-next-word + And I run :yank-selected + Then the clipboard should contain "eins " + + Scenario: Moving to the start of next block (with selection) + When I run :toggle-selection + And I run :move-to-start-of-next-block + And I run :yank-selected + Then the clipboard should contain "one two three\n" + + Scenario: Moving to the start of next block + When I run :move-to-start-of-next-block + And I run :toggle-selection + And I run :move-to-end-of-word + And I run :yank-selected + Then the clipboard should contain "eins" + + # line + + Scenario: Selecting a line + When I run :toggle-selection + And I run :move-to-end-of-line + And I run :yank-selected + Then the clipboard should contain "one two three" + + Scenario: Moving and selecting a line + When I run :move-to-next-line + And I run :toggle-selection + And I run :move-to-end-of-line + And I run :yank-selected + Then the clipboard should contain "eins zwei drei" + + Scenario: Selecting next line + When I run :toggle-selection + And I run :move-to-next-line + And I run :yank-selected + Then the clipboard should contain "one two three\n" + + Scenario: Moving to end and to start of line + When I run :move-to-end-of-line + And I run :move-to-start-of-line + And I run :toggle-selection + And I run :move-to-end-of-word + And I run :yank-selected + Then the clipboard should contain "one" + + Scenario: Selecting a line (backwards) + When I run :move-to-end-of-line + And I run :toggle-selection + When I run :move-to-start-of-line + And I run :yank-selected + Then the clipboard should contain "one two three" + + Scenario: Selecting previous line + When I run :move-to-next-line + And I run :toggle-selection + When I run :move-to-prev-line + And I run :yank-selected + Then the clipboard should contain "one two three\n" + + Scenario: Moving to previous line + When I run :move-to-next-line + When I run :move-to-prev-line + And I run :toggle-selection + When I run :move-to-next-line + And I run :yank-selected + Then the clipboard should contain "one two three\n" + + # word + + Scenario: Selecting a word + When I run :toggle-selection + And I run :move-to-end-of-word + And I run :yank-selected + Then the clipboard should contain "one" + + Scenario: Moving to end and selecting a word + When I run :move-to-end-of-word + And I run :toggle-selection + And I run :move-to-end-of-word + And I run :yank-selected + Then the clipboard should contain " two" + + Scenario: Moving to next word and selecting a word + When I run :move-to-next-word + And I run :toggle-selection + And I run :move-to-end-of-word + And I run :yank-selected + Then the clipboard should contain "two" + + Scenario: Moving to next word and selecting until next word + When I run :move-to-next-word + And I run :toggle-selection + And I run :move-to-next-word + And I run :yank-selected + Then the clipboard should contain "two " + + Scenario: Moving to previous word and selecting a word + When I run :move-to-end-of-word + And I run :toggle-selection + And I run :move-to-prev-word + And I run :yank-selected + Then the clipboard should contain "one" + + Scenario: Moving to previous word + When I run :move-to-end-of-word + And I run :move-to-prev-word + And I run :toggle-selection + And I run :move-to-end-of-word + And I run :yank-selected + Then the clipboard should contain "one" + + # char + + Scenario: Selecting a char + When I run :toggle-selection + And I run :move-to-next-char + And I run :yank-selected + Then the clipboard should contain "o" + + Scenario: Moving and selecting a char + When I run :move-to-next-char + And I run :toggle-selection + And I run :move-to-next-char + And I run :yank-selected + Then the clipboard should contain "n" + + Scenario: Selecting previous char + When I run :move-to-end-of-word + And I run :toggle-selection + And I run :move-to-prev-char + And I run :yank-selected + Then the clipboard should contain "e" + + Scenario: Moving to previous char + When I run :move-to-end-of-word + And I run :move-to-prev-char + And I run :toggle-selection + And I run :move-to-end-of-word + And I run :yank-selected + Then the clipboard should contain "e" + + # :yank-selected + + Scenario: :yank-selected without selection + When I run :yank-selected + Then the message "Nothing to yank" should be shown. + + Scenario: :yank-selected message + When I run :toggle-selection + And I run :move-to-end-of-word + And I run :yank-selected + Then the message "3 chars yanked to clipboard" should be shown. + + Scenario: :yank-selected message with one char + When I run :toggle-selection + And I run :move-to-next-char + And I run :yank-selected + Then the message "1 char yanked to clipboard" should be shown. + + Scenario: :yank-selected with primary selection + When selection is supported + And I run :toggle-selection + And I run :move-to-end-of-word + And I run :yank-selected --sel + Then the message "3 chars yanked to primary selection" should be shown. + And the primary selection should contain "one" + + Scenario: :yank-selected with --keep + When I run :toggle-selection + And I run :move-to-end-of-word + And I run :yank-selected --keep + And I run :move-to-end-of-word + And I run :yank-selected --keep + Then the message "3 chars yanked to clipboard" should be shown. + And the message "7 chars yanked to clipboard" should be shown. + And the clipboard should contain "one two" diff --git a/tests/integration/features/test_caret.py b/tests/integration/features/test_caret.py new file mode 100644 index 000000000..652b015f8 --- /dev/null +++ b/tests/integration/features/test_caret.py @@ -0,0 +1,39 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2015 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +import pytest + +import pytest_bdd as bdd + +from test_yankpaste import skip_with_broken_clipboard + + +# https://github.com/The-Compiler/qutebrowser/issues/1124#issuecomment-158073581 +pytestmark = pytest.mark.qt_log_ignore( + '^QXcbClipboard: SelectionRequest too old', extend=True) + + +bdd.scenarios('caret.feature') + + +@bdd.then(bdd.parsers.parse('the clipboard should contain:\n{content}')) +def clipboard_contains_multiline(qapp, content): + data = qapp.clipboard().text() + expected = '\n'.join(line.strip() for line in content.splitlines()) + assert data == expected