#include #include #include #include class QStateMachineInitialStateIssue : public QObject { Q_OBJECT private slots: void existingStateOk(); void addSiblingStateWhileRunningOk(); void existingChildOk(); void addChildWhileRunningFail(); }; void QStateMachineInitialStateIssue::existingStateOk() { QStateMachine stateMachine(this); QState root(&stateMachine); stateMachine.setInitialState(&root); // Add state before starting QState other(&stateMachine); QSignalSpy otherEntered(&other, &QState::entered); // Start QSignalSpy stateMachineStarted(&stateMachine, &QStateMachine::started); stateMachine.start(); QVERIFY(stateMachineStarted.wait()); QVERIFY(stateMachine.isRunning()); QCOMPARE(stateMachine.configuration().count(), 1); QVERIFY(stateMachine.configuration().contains(&root)); // Add substate while running QTimer timer; root.addTransition(&timer, &QTimer::timeout, &other); timer.start(100); QVERIFY(otherEntered.wait()); QCOMPARE(stateMachine.configuration().count(), 1); QVERIFY(stateMachine.configuration().contains(&other)); } void QStateMachineInitialStateIssue::addSiblingStateWhileRunningOk() { QStateMachine stateMachine(this); QState root(&stateMachine); stateMachine.setInitialState(&root); // Start QSignalSpy stateMachineStarted(&stateMachine, &QStateMachine::started); stateMachine.start(); QVERIFY(stateMachineStarted.wait()); QVERIFY(stateMachine.isRunning()); QCOMPARE(stateMachine.configuration().count(), 1); QVERIFY(stateMachine.configuration().contains(&root)); // Add state while running QState other(&stateMachine); QSignalSpy otherEntered(&other, &QState::entered); // Trigger transition QTimer timer; root.addTransition(&timer, &QTimer::timeout, &other); timer.start(100); QVERIFY(otherEntered.wait()); QCOMPARE(stateMachine.configuration().count(), 1); QVERIFY(stateMachine.configuration().contains(&other)); } void QStateMachineInitialStateIssue::existingChildOk() { QStateMachine stateMachine(this); QState root(&stateMachine); stateMachine.setInitialState(&root); // Add child state before starting QState childState(&root); QSignalSpy childStateEntered(&childState, &QState::entered); root.setInitialState(&childState); // Start QSignalSpy stateMachineStarted(&stateMachine, &QStateMachine::started); stateMachine.start(); QVERIFY(stateMachineStarted.wait()); QVERIFY(stateMachine.isRunning()); QCOMPARE(stateMachine.configuration().count(), 2); QVERIFY(stateMachine.configuration().contains(&root)); QVERIFY(stateMachine.configuration().contains(&childState)); } void QStateMachineInitialStateIssue::addChildWhileRunningFail() { QStateMachine stateMachine(this); QState root(&stateMachine); stateMachine.setInitialState(&root); // Start QSignalSpy stateMachineStarted(&stateMachine, &QStateMachine::started); stateMachine.start(); QVERIFY(stateMachineStarted.wait()); QVERIFY(stateMachine.isRunning()); QCOMPARE(stateMachine.configuration().count(), 1); QVERIFY(stateMachine.configuration().contains(&root)); // Add child state while running QState childState(&root); root.setInitialState(&childState); QSignalSpy childStateEntered(&childState, &QState::entered); // Trigger transition QTimer timer; root.addTransition(&timer, &QTimer::timeout, &childState); timer.start(100); QVERIFY(childStateEntered.wait()); QCOMPARE(stateMachine.configuration().count(), 2); QVERIFY(stateMachine.configuration().contains(&root)); QVERIFY(stateMachine.configuration().contains(&childState)); } QTEST_MAIN(QStateMachineInitialStateIssue) #include "tst_qstatemachineinitialstateissue.moc"