diff --git a/tests/integration/features/caret.feature b/tests/integration/features/caret.feature index b6b3fab32..79faae189 100644 --- a/tests/integration/features/caret.feature +++ b/tests/integration/features/caret.feature @@ -10,7 +10,7 @@ Feature: Caret mode Scenario: Selecting the entire document When I run :toggle-selection And I run :move-to-end-of-document - And I yank the selected text + And I run :yank-selected Then the clipboard should contain: one two three eins zwei drei @@ -23,14 +23,14 @@ Feature: Caret mode And I run :move-to-start-of-document And I run :toggle-selection And I run :move-to-end-of-word - And I yank the selected text + 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 yank the selected text + And I run :yank-selected Then the clipboard should contain: one two three eins zwei drei @@ -43,7 +43,7 @@ Feature: Caret mode Scenario: Selecting a block When I run :toggle-selection And I run :move-to-end-of-next-block - And I yank the selected text + And I run :yank-selected Then the clipboard should contain: one two three eins zwei drei @@ -53,7 +53,7 @@ Feature: Caret mode And I run :toggle-selection And I run :move-to-end-of-prev-block And I run :move-to-prev-word - And I yank the selected text + And I run :yank-selected Then the clipboard should contain: drei @@ -64,14 +64,14 @@ Feature: Caret mode And I run :move-to-end-of-prev-block And I run :toggle-selection And I run :move-to-prev-word - And I yank the selected text + 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 yank the selected text + And I run :yank-selected Then the clipboard should contain: eins zwei drei @@ -82,20 +82,20 @@ Feature: Caret mode And I run :move-to-start-of-prev-block And I run :toggle-selection And I run :move-to-next-word - And I yank the selected text + 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 yank the selected text + 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 yank the selected text + And I run :yank-selected Then the clipboard should contain "eins" # line @@ -103,20 +103,20 @@ Feature: Caret mode Scenario: Selecting a line When I run :toggle-selection And I run :move-to-end-of-line - And I yank the selected text + 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 yank the selected text + 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 yank the selected text + And I run :yank-selected Then the clipboard should contain "one two three\n" Scenario: Moving to end and to start of line @@ -124,21 +124,21 @@ Feature: Caret mode And I run :move-to-start-of-line And I run :toggle-selection And I run :move-to-end-of-word - And I yank the selected text + 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 yank the selected text + 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 yank the selected text + And I run :yank-selected Then the clipboard should contain "one two three\n" Scenario: Moving to previous line @@ -146,7 +146,7 @@ Feature: Caret mode When I run :move-to-prev-line And I run :toggle-selection When I run :move-to-next-line - And I yank the selected text + And I run :yank-selected Then the clipboard should contain "one two three\n" # word @@ -154,35 +154,35 @@ Feature: Caret mode Scenario: Selecting a word When I run :toggle-selection And I run :move-to-end-of-word - And I yank the selected text + 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 yank the selected text + 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 yank the selected text + 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 yank the selected text + 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 yank the selected text + And I run :yank-selected Then the clipboard should contain "one" Scenario: Moving to previous word @@ -190,7 +190,7 @@ Feature: Caret mode And I run :move-to-prev-word And I run :toggle-selection And I run :move-to-end-of-word - And I yank the selected text + And I run :yank-selected Then the clipboard should contain "one" # char @@ -198,21 +198,21 @@ Feature: Caret mode Scenario: Selecting a char When I run :toggle-selection And I run :move-to-next-char - And I yank the selected text + 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 yank the selected text + 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 yank the selected text + And I run :yank-selected Then the clipboard should contain "e" Scenario: Moving to previous char @@ -220,7 +220,7 @@ Feature: Caret mode And I run :move-to-prev-char And I run :toggle-selection And I run :move-to-end-of-word - And I yank the selected text + And I run :yank-selected Then the clipboard should contain "e" # :yank-selected diff --git a/tests/integration/features/conftest.py b/tests/integration/features/conftest.py index e1078f663..329bba8ca 100644 --- a/tests/integration/features/conftest.py +++ b/tests/integration/features/conftest.py @@ -29,6 +29,7 @@ import collections import pytest import yaml import pytest_bdd as bdd +from PyQt5.QtCore import QElapsedTimer from PyQt5.QtGui import QClipboard from helpers import utils @@ -350,12 +351,37 @@ def check_open_tabs(quteproc, tabs): assert 'active' not in session_tab +def _wait_for_clipboard(qtbot, clipboard, mode, expected): + timeout = 1000 + timer = QElapsedTimer() + timer.start() + + while True: + if clipboard.text(mode=mode) == expected: + return + with qtbot.waitSignal(clipboard.changed, timeout=timeout) as blocker: + pass + if not blocker.signal_emitted or timer.hasExpired(timeout): + mode_names = { + QClipboard.Clipboard: 'clipboard', + QClipboard.Selection: 'primary selection', + } + raise WaitForTimeout( + "Timed out after {}ms waiting for {} in {}.".format( + timeout, expected, mode_names[mode])) + + @bdd.then(bdd.parsers.re(r'the (?Pprimary selection|clipboard) should ' r'contain "(?P.*)"')) -def clipboard_contains(qapp, httpbin, what, content): +def clipboard_contains(qtbot, qapp, httpbin, what, content): mode = _clipboard_mode(qapp, what) expected = content.replace('(port)', str(httpbin.port)) expected = expected.replace('\\n', '\n') + _wait_for_clipboard(qtbot, qapp.clipboard(), mode, expected) - data = qapp.clipboard().text(mode=mode) - assert data == expected + +@bdd.then(bdd.parsers.parse('the clipboard should contain:\n{content}')) +def clipboard_contains_multiline(qtbot, qapp, content): + expected = '\n'.join(line.strip() for line in content.splitlines()) + _wait_for_clipboard(qtbot, qapp.clipboard(), QClipboard.Clipboard, + expected) diff --git a/tests/integration/features/test_caret.py b/tests/integration/features/test_caret.py index 1f59455d1..5920e7981 100644 --- a/tests/integration/features/test_caret.py +++ b/tests/integration/features/test_caret.py @@ -20,6 +20,7 @@ import pytest import pytest_bdd as bdd +from PyQt5.QtGui import QClipboard # pylint: disable=unused-import from test_yankpaste import skip_with_broken_clipboard @@ -31,17 +32,3 @@ pytestmark = pytest.mark.qt_log_ignore( bdd.scenarios('caret.feature') - - -@bdd.when("I yank the selected text") -def yank_selected_text(qtbot, qapp, quteproc): - """Run :yank-selected and wait until the clipboard content changes.""" - with qtbot.wait_signal(qapp.clipboard().changed): - quteproc.send_cmd(':yank-selected') - - -@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