summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitrii Akshintsev <dmitrii.akshintsev@qt.io>2024-04-16 17:13:19 +0200
committerDmitrii Akshintsev <dmitrii.akshintsev@qt.io>2024-04-17 11:00:26 +0000
commit2c966b97be56557007f198ee906844f78ef2944a (patch)
treeeea165af46ae9c483738a9129bc61f8e16cb394b
parent9c8577c12643bf222dc37a5ba2dc1d08dc168f8e (diff)
QScxmlStateMachine add runtime warning
As suggested by Ulf, in addition to correcting the documentation runtime warning will be helpful. This commit adds the warning and a test for that Change-Id: I6dbd727e493431d7d71efbc5b527df8d67d50dcd Fixes: QTBUG-109371 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
-rw-r--r--src/scxml/qscxmlstatemachine.cpp6
-rw-r--r--src/scxml/qscxmlstatemachine_p.h1
-rw-r--r--tests/auto/statemachine/tst_statemachine.cpp19
3 files changed, 26 insertions, 0 deletions
diff --git a/src/scxml/qscxmlstatemachine.cpp b/src/scxml/qscxmlstatemachine.cpp
index 71d35b3..04d3726 100644
--- a/src/scxml/qscxmlstatemachine.cpp
+++ b/src/scxml/qscxmlstatemachine.cpp
@@ -2262,12 +2262,18 @@ QBindable<QList<QScxmlInvokableService*>> QScxmlStateMachine::bindableInvokedSer
\note Calling start() after stop() will not result in a full reset of its
configuration yet, hence it is strongly advised not to do it.
+ \note Starting a finished machine yields a warning.
+
\sa runningChanged(), setRunning(), stop(), finished()
*/
void QScxmlStateMachine::start()
{
Q_D(QScxmlStateMachine);
+ if (d->isFinished()) {
+ qCWarning(qscxmlLog) << this << "Can't start finished machine";
+ }
+
if (!parseErrors().isEmpty())
return;
diff --git a/src/scxml/qscxmlstatemachine_p.h b/src/scxml/qscxmlstatemachine_p.h
index 35fab46..3d18ffc 100644
--- a/src/scxml/qscxmlstatemachine_p.h
+++ b/src/scxml/qscxmlstatemachine_p.h
@@ -391,6 +391,7 @@ private:
}
bool isPaused() const { return m_runningState == Paused; }
+ bool isFinished() const { return m_runningState == Finished; }
QScxmlInternal::StateMachineInfoProxy *m_infoSignalProxy;
diff --git a/tests/auto/statemachine/tst_statemachine.cpp b/tests/auto/statemachine/tst_statemachine.cpp
index 85d06c8..1aa74f7 100644
--- a/tests/auto/statemachine/tst_statemachine.cpp
+++ b/tests/auto/statemachine/tst_statemachine.cpp
@@ -31,6 +31,7 @@ private Q_SLOTS:
void doneDotStateEvent();
void running();
+ void restart();
void invokeStateMachine();
@@ -392,6 +393,24 @@ void tst_StateMachine::running()
QCOMPARE(stateMachine->isRunning(), false);
}
+void tst_StateMachine::restart()
+{
+ QScopedPointer<QScxmlStateMachine> stateMachine(
+ QScxmlStateMachine::fromFile(QString(":/tst_statemachine/stateDotDoneEvent.scxml")));
+ QVERIFY(!stateMachine.isNull());
+
+ QSignalSpy finishedSpy(stateMachine.data(), SIGNAL(finished()));
+
+ stateMachine->start();
+ finishedSpy.wait(5000);
+ QCOMPARE(finishedSpy.size(), 1);
+ QCOMPARE(stateMachine->activeStateNames(true).size(), 1);
+ QVERIFY(stateMachine->activeStateNames(true).contains(QLatin1String("success")));
+
+ QTest::ignoreMessage(QtWarningMsg, QRegularExpression("(.*)Can't start finished machine"));
+ stateMachine->start();
+}
+
void tst_StateMachine::invokeStateMachine()
{
QScopedPointer<QScxmlStateMachine> stateMachine(