diff options
Diffstat (limited to 'tests/auto/corelib')
-rw-r--r-- | tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp index b14ab7d1c5..8c67c0ec03 100644 --- a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp +++ b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp @@ -208,6 +208,7 @@ private slots: void signalTransitionNormalizeSignature(); void createSignalTransitionWhenRunning(); void createEventTransitionWhenRunning(); + void signalTransitionSenderInDifferentThread(); }; class TestState : public QState @@ -4827,5 +4828,61 @@ void tst_QStateMachine::createEventTransitionWhenRunning() QTRY_VERIFY(machine.configuration().contains(s4)); } +class SignalEmitterThread : public QThread +{ + Q_OBJECT +public: + SignalEmitterThread(QObject *parent = 0) + : QThread(parent) + { + moveToThread(this); + } + +Q_SIGNALS: + void signal1(); + void signal2(); + +public Q_SLOTS: + void emitSignals() + { + emit signal1(); + emit signal2(); + } +}; + +// QTBUG-19789 +void tst_QStateMachine::signalTransitionSenderInDifferentThread() +{ + QStateMachine machine; + QState *s1 = new QState(&machine); + machine.setInitialState(s1); + + SignalEmitterThread thread; + QState *s2 = new QState(&machine); + s1->addTransition(&thread, SIGNAL(signal1()), s2); + + QFinalState *s3 = new QFinalState(&machine); + s2->addTransition(&thread, SIGNAL(signal2()), s3); + + thread.start(); + QTRY_VERIFY(thread.isRunning()); + + machine.start(); + QTRY_VERIFY(machine.configuration().contains(s1)); + + QMetaObject::invokeMethod(&thread, "emitSignals"); + // thread emits both signal1() and signal2(), so we should end in s3 + QTRY_VERIFY(machine.configuration().contains(s3)); + + // Run the machine again; transitions should still be registered + machine.start(); + QTRY_VERIFY(machine.configuration().contains(s1)); + QMetaObject::invokeMethod(&thread, "emitSignals"); + QTRY_VERIFY(machine.configuration().contains(s3)); + + thread.quit(); + QTRY_VERIFY(thread.wait()); +} + QTEST_MAIN(tst_QStateMachine) #include "tst_qstatemachine.moc" |