summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/statemachine/qeventtransition.cpp2
-rw-r--r--src/corelib/statemachine/qsignaltransition.cpp1
-rw-r--r--tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp86
3 files changed, 89 insertions, 0 deletions
diff --git a/src/corelib/statemachine/qeventtransition.cpp b/src/corelib/statemachine/qeventtransition.cpp
index ed00d6681e..3c93281e98 100644
--- a/src/corelib/statemachine/qeventtransition.cpp
+++ b/src/corelib/statemachine/qeventtransition.cpp
@@ -150,6 +150,7 @@ QEventTransition::QEventTransition(QObject *object, QEvent::Type type,
d->registered = false;
d->object = object;
d->eventType = type;
+ d->maybeRegister();
}
/*!
@@ -171,6 +172,7 @@ QEventTransition::QEventTransition(QEventTransitionPrivate &dd, QObject *object,
d->registered = false;
d->object = object;
d->eventType = type;
+ d->maybeRegister();
}
/*!
diff --git a/src/corelib/statemachine/qsignaltransition.cpp b/src/corelib/statemachine/qsignaltransition.cpp
index bbd7bc4e19..26d2add8cf 100644
--- a/src/corelib/statemachine/qsignaltransition.cpp
+++ b/src/corelib/statemachine/qsignaltransition.cpp
@@ -155,6 +155,7 @@ QSignalTransition::QSignalTransition(QObject *sender, const char *signal,
Q_D(QSignalTransition);
d->sender = sender;
d->signal = signal;
+ d->maybeRegister();
}
/*!
diff --git a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
index 88110b1d5d..b14ab7d1c5 100644
--- a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
+++ b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
@@ -206,6 +206,8 @@ private slots:
void multiTargetTransitionInsideParallelStateGroup();
void signalTransitionNormalizeSignature();
+ void createSignalTransitionWhenRunning();
+ void createEventTransitionWhenRunning();
};
class TestState : public QState
@@ -4741,5 +4743,89 @@ void tst_QStateMachine::signalTransitionNormalizeSignature()
QCOMPARE(t0->transitionArgumentsReceived().size(), 0);
}
+void tst_QStateMachine::createSignalTransitionWhenRunning()
+{
+ QStateMachine machine;
+ QState *s1 = new QState(&machine);
+ machine.setInitialState(s1);
+ machine.start();
+ QTRY_VERIFY(machine.configuration().contains(s1));
+
+ // Create by addTransition()
+ QState *s2 = new QState(&machine);
+ SignalEmitter emitter;
+ QAbstractTransition *t1 = s1->addTransition(&emitter, SIGNAL(signalWithNoArg()), s2);
+ QCOMPARE(t1->sourceState(), s1);
+ emitter.emitSignalWithNoArg();
+ QTRY_VERIFY(machine.configuration().contains(s2));
+
+ // Create by constructor that takes sender, signal, source (parent) state
+ QState *s3 = new QState(&machine);
+ QSignalTransition *t2 = new QSignalTransition(&emitter, SIGNAL(signalWithNoArg()), s2);
+ QCOMPARE(t2->sourceState(), s2);
+ t2->setTargetState(s3);
+ emitter.emitSignalWithNoArg();
+ QTRY_VERIFY(machine.configuration().contains(s3));
+
+ // Create by constructor that takes source (parent) state
+ QState *s4 = new QState(&machine);
+ QSignalTransition *t3 = new QSignalTransition(s3);
+ QCOMPARE(t3->sourceState(), s3);
+ t3->setSenderObject(&emitter);
+ t3->setSignal(SIGNAL(signalWithNoArg()));
+ t3->setTargetState(s4);
+ emitter.emitSignalWithNoArg();
+ QTRY_VERIFY(machine.configuration().contains(s4));
+
+ // Create by constructor without parent, then set the parent
+ QState *s5 = new QState(&machine);
+ QSignalTransition *t4 = new QSignalTransition();
+ t4->setSenderObject(&emitter);
+ t4->setParent(s4);
+ QCOMPARE(t4->sourceState(), s4);
+ t4->setSignal(SIGNAL(signalWithNoArg()));
+ t4->setTargetState(s5);
+ emitter.emitSignalWithNoArg();
+ QTRY_VERIFY(machine.configuration().contains(s5));
+}
+
+void tst_QStateMachine::createEventTransitionWhenRunning()
+{
+ QStateMachine machine;
+ QState *s1 = new QState(&machine);
+ machine.setInitialState(s1);
+ machine.start();
+ QTRY_VERIFY(machine.configuration().contains(s1));
+
+ // Create by constructor that takes event source, type, source (parent) state
+ QState *s2 = new QState(&machine);
+ QObject object;
+ QEventTransition *t1 = new QEventTransition(&object, QEvent::Timer, s1);
+ QCOMPARE(t1->sourceState(), s1);
+ t1->setTargetState(s2);
+
+ object.startTimer(10); // Will cause QEvent::Timer to fire every 10ms
+ QTRY_VERIFY(machine.configuration().contains(s2));
+
+ // Create by constructor that takes source (parent) state
+ QState *s3 = new QState(&machine);
+ QEventTransition *t2 = new QEventTransition(s2);
+ QCOMPARE(t2->sourceState(), s2);
+ t2->setEventSource(&object);
+ t2->setEventType(QEvent::Timer);
+ t2->setTargetState(s3);
+ QTRY_VERIFY(machine.configuration().contains(s3));
+
+ // Create by constructor without parent, then set the parent
+ QState *s4 = new QState(&machine);
+ QEventTransition *t3 = new QEventTransition();
+ t3->setEventSource(&object);
+ t3->setParent(s3);
+ QCOMPARE(t3->sourceState(), s3);
+ t3->setEventType(QEvent::Timer);
+ t3->setTargetState(s4);
+ QTRY_VERIFY(machine.configuration().contains(s4));
+}
+
QTEST_MAIN(tst_QStateMachine)
#include "tst_qstatemachine.moc"