Skip to content

Incorrect waitSignal + connect #607

Open
@danicc097

Description

@danicc097
import pytest
from PySide6.QtCore import QObject, Signal, QThread, QTimer
from PySide6.QtWidgets import QApplication
from pytestqt.qtbot import QtBot


@pytest.fixture(scope="session", autouse=True)
def qapp_instance():
    app = QApplication.instance()
    if app is None:
        app = QApplication([])
    return app


class MySignalEmitter(QObject):
    signal_A_emitted = Signal(str, int)
    signal_B_emitted = Signal(bool, float)

    def __init__(self):
        super().__init__()
        self._thread = QThread()
        self.moveToThread(self._thread)
        self._thread.started.connect(self._keep_thread_alive)

    def _keep_thread_alive(self):

        pass

    def start(self):
        if not self._thread.isRunning():
            self._thread.start()

    def stop(self):
        if self._thread.isRunning():
            self._thread.quit()
            self._thread.wait(500)

    def emit_signal_A(self, message: str, code: int):

        if self._thread.isRunning():
            QTimer.singleShot(0, lambda: self.signal_A_emitted.emit(message, code))
        else:
            self.signal_A_emitted.emit(message, code)


    def emit_signal_B(self, status: bool, value: float):
        if self._thread.isRunning():
            QTimer.singleShot(0, lambda: self.signal_B_emitted.emit(status, value))
        else:
            self.signal_B_emitted.emit(status, value)




def test_signals(qtbot: QtBot):
    emitter = MySignalEmitter()
    emitter.start()

    with qtbot.waitSignal((emitter.signal_A_emitted, "A"), timeout=3000, raising=True) as blocker:
        blocker.connect((emitter.signal_B_emitted, "B"))
        emitter.emit_signal_B(True, 3.14)

    assert blocker.signal_triggered is True
    assert blocker.args == [True, 3.14]
    assert blocker.signal_name == "B"

    with qtbot.waitSignal((emitter.signal_A_emitted, "A"), timeout=3000, raising=True) as blocker:
        blocker.connect((emitter.signal_B_emitted, "B"))
        emitter.emit_signal_A("message", 0)

    assert blocker.signal_triggered is True
    assert blocker.args == ["message", 0]
    assert blocker.signal_name == "A"

    emitter.stop()

will fail with:

>       assert blocker.signal_name == "A"
E       AssertionError: assert 'B' == 'A'
E
E         - A
E         + B

src\tests\issue_pytestqt_test.py:73: AssertionError

what is the workaround to have an OR condition?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions