From f108fceb2c548687a115ec7ba6186f674db34a02 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 9 Jul 2012 09:56:58 +0200 Subject: Make it possible to connect to QAbstract{State,Transtion} private signals. Use the same trick as used for private signals in the models. Change-Id: I4235788490cae0e3d554565621d145652dc5b0ca Reviewed-by: Olivier Goffart --- .../corelib/statemachine/qstate/tst_qstate.cpp | 121 +++++++++++++++++++++ 1 file changed, 121 insertions(+) (limited to 'tests/auto/corelib/statemachine/qstate/tst_qstate.cpp') diff --git a/tests/auto/corelib/statemachine/qstate/tst_qstate.cpp b/tests/auto/corelib/statemachine/qstate/tst_qstate.cpp index 841a111070..ee87b3633e 100644 --- a/tests/auto/corelib/statemachine/qstate/tst_qstate.cpp +++ b/tests/auto/corelib/statemachine/qstate/tst_qstate.cpp @@ -57,6 +57,7 @@ private slots: void assignPropertyTwice(); void historyInitialState(); void transitions(); + void privateSignals(); private: bool functionCalled; @@ -237,5 +238,125 @@ void tst_QState::transitions() QCOMPARE(s21->transitions().first(), t3); } +class MyState : public QState +{ + Q_OBJECT +public: + MyState(QState *parent = 0) + : QState(parent) + { + + } + + void emitPrivateSignals() + { + // These deliberately do not compile +// emit entered(); +// emit exited(); +// +// emit entered(QPrivateSignal()); +// emit exited(QPrivateSignal()); +// +// emit entered(QAbstractState::QPrivateSignal()); +// emit exited(QAbstractState::QPrivateSignal()); + } + +}; + +class MyTransition : public QSignalTransition +{ + Q_OBJECT +public: + MyTransition(QObject * sender, const char * signal, QState *sourceState = 0) + : QSignalTransition(sender, signal, sourceState) + { + + } + + void emitPrivateSignals() + { + // These deliberately do not compile +// emit triggered(); +// +// emit triggered(QPrivateSignal()); +// +// emit triggered(QAbstractTransition::QPrivateSignal()); + } +}; + +class SignalConnectionTester : public QObject +{ + Q_OBJECT +public: + SignalConnectionTester(QObject *parent = 0) + : QObject(parent), testPassed(false) + { + + } + +public Q_SLOTS: + void testSlot() + { + testPassed = true; + } + +public: + bool testPassed; +}; + +class TestTrigger : public QObject +{ + Q_OBJECT +public: + TestTrigger(QObject *parent = 0) + : QObject(parent) + { + + } + + void emitTrigger() + { + emit trigger(); + } + +signals: + void trigger(); +}; + +void tst_QState::privateSignals() +{ + QStateMachine machine; + + QState *s1 = new QState(&machine); + MyState *s2 = new MyState(&machine); + + TestTrigger testTrigger; + + MyTransition *t1 = new MyTransition(&testTrigger, SIGNAL(trigger()), s1); + s1->addTransition(t1); + t1->setTargetState(s2); + + machine.setInitialState(s1); + machine.start(); + QCoreApplication::processEvents(); + + SignalConnectionTester s1Tester; + SignalConnectionTester s2Tester; + SignalConnectionTester t1Tester; + + QObject::connect(s1, &QState::exited, &s1Tester, &SignalConnectionTester::testSlot); + QObject::connect(s2, &QState::entered, &s2Tester, &SignalConnectionTester::testSlot); + QObject::connect(t1, &QSignalTransition::triggered, &t1Tester, &SignalConnectionTester::testSlot); + + testTrigger.emitTrigger(); + + QCoreApplication::processEvents(); + + QVERIFY(s1Tester.testPassed); + QVERIFY(s2Tester.testPassed); + QVERIFY(t1Tester.testPassed); + +} + QTEST_MAIN(tst_QState) #include "tst_qstate.moc" -- cgit v1.2.3