Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,13 @@
- Widgets registered by ``qtbot.addWidget`` are now closed before all other
fixtures are tear down (`106`_). Thanks `@The-Compiler`_ for request.

- ``qtbot`` now has a new ``wait`` method which does a blocking wait while the
event loop continues to run, similar to ``QTest::qWait``. Thanks
`@The-Compiler`_ for the PR (closes `107`_)!

.. _105: https://github.com/pytest-dev/pytest-qt/issues/105
.. _106: https://github.com/pytest-dev/pytest-qt/issues/106
.. _107: https://github.com/pytest-dev/pytest-qt/issues/107


1.8.0
Expand Down
12 changes: 12 additions & 0 deletions pytestqt/qtbot.py
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,18 @@ def waitSignals(self, signals=None, timeout=1000, raising=False):

wait_signals = waitSignals # pep-8 alias

def wait(self, ms):
"""
.. versionadded:: 1.9

Waits for ``ms`` milliseconds.

While waiting, events will be processed and your test will stay
responsive to user interface events or network communication.
"""
blocker = MultiSignalBlocker(timeout=ms)
blocker.wait()


# provide easy access to SignalTimeoutError to qtbot fixtures
QtBot.SignalTimeoutError = SignalTimeoutError
Expand Down
15 changes: 13 additions & 2 deletions tests/test_wait_signal.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,20 +224,24 @@ class StopWatch:

def __init__(self):
self._start_time = None
self.elapsed = None

def start(self):
self._start_time = get_time()

def stop(self):
self.elapsed = (get_time() - self._start_time) * 1000.0

def check(self, timeout, *delays):
"""
Make sure either timeout (if given) or at most of the given
delays used to trigger a signal has passed.
"""
self.stop()
if timeout is None:
timeout = max(delays) * 1.35 # 35% tolerance
max_wait_ms = max(delays + (timeout,))
elapsed_ms = (get_time() - self._start_time) * 1000.0
assert elapsed_ms < max_wait_ms
assert self.elapsed < max_wait_ms

return StopWatch()

Expand Down Expand Up @@ -304,3 +308,10 @@ class Obj(QtCore.QObject):
obj.deleteLater()

assert sip.isdeleted(obj)


def test_qtbot_wait(qtbot, stop_watch):
stop_watch.start()
qtbot.wait(100)
stop_watch.stop()
assert stop_watch.elapsed >= 95