From 9e85ae4674ed44e9c04dedb4ea4959833b6322cd Mon Sep 17 00:00:00 2001 From: Jan Arne Petersen Date: Sat, 19 Nov 2016 06:55:15 +0100 Subject: Add QScxmlStateMachineInfo::transitionEvents() Also add corresponding test for the new method. Change-Id: I09c4bb59df06bd33ae8a8667194d5f5d96765e2e Reviewed-by: Ulf Hermann --- src/scxml/qscxmlstatemachineinfo.cpp | 21 +++++++++++++++++++++ src/scxml/qscxmlstatemachineinfo_p.h | 1 + .../auto/statemachineinfo/tst_statemachineinfo.cpp | 9 +++++++++ 3 files changed, 31 insertions(+) diff --git a/src/scxml/qscxmlstatemachineinfo.cpp b/src/scxml/qscxmlstatemachineinfo.cpp index 94cc939..7dea3f2 100644 --- a/src/scxml/qscxmlstatemachineinfo.cpp +++ b/src/scxml/qscxmlstatemachineinfo.cpp @@ -198,6 +198,27 @@ QVector QScxmlStateMachineInfo::transitionTarge return targets; } +QVector QScxmlStateMachineInfo::transitionEvents(TransitionId transitionId) const +{ + Q_D(const QScxmlStateMachineInfo); + + QVector events; + if (transitionId < 0 || transitionId >= d->stateTable()->transitionCount) + return events; + + auto transition = d->stateTable()->transition(transitionId); + if (transition.events == QScxmlExecutableContent::StateTable::InvalidIndex) + return events; + + auto eventIds = d->stateTable()->array(transition.events); + events.reserve(eventIds.size()); + for (auto eventId : eventIds) { + events.append(d->stateMachinePrivate()->m_tableData->string(eventId)); + } + + return events; +} + QVector QScxmlStateMachineInfo::configuration() const { Q_D(const QScxmlStateMachineInfo); diff --git a/src/scxml/qscxmlstatemachineinfo_p.h b/src/scxml/qscxmlstatemachineinfo_p.h index 45d5fb7..e0877a3 100644 --- a/src/scxml/qscxmlstatemachineinfo_p.h +++ b/src/scxml/qscxmlstatemachineinfo_p.h @@ -95,6 +95,7 @@ public: // methods TransitionType transitionType(TransitionId transitionId) const; StateId transitionSource(TransitionId transitionId) const; QVector transitionTargets(TransitionId transitionId) const; + QVector transitionEvents(TransitionId transitionId) const; QVector configuration() const; Q_SIGNALS: diff --git a/tests/auto/statemachineinfo/tst_statemachineinfo.cpp b/tests/auto/statemachineinfo/tst_statemachineinfo.cpp index 1c33847..9814dbf 100644 --- a/tests/auto/statemachineinfo/tst_statemachineinfo.cpp +++ b/tests/auto/statemachineinfo/tst_statemachineinfo.cpp @@ -122,24 +122,31 @@ void tst_StateMachineInfo::checkInfo() QCOMPARE(info->stateType(info->transitionSource(transitions.at(0))), QScxmlStateMachineInfo::StateMachineRootState); QCOMPARE(info->transitionTargets(transitions.at(0)).size(), 0); + QCOMPARE(info->transitionEvents(transitions.at(0)).size(), 0); // ->next QCOMPARE(info->transitionType(transitions.at(1)), QScxmlStateMachineInfo::ExternalTransition); QCOMPARE(info->transitionSource(transitions.at(1)), states.at(0)); QCOMPARE(info->transitionTargets(transitions.at(1)).size(), 1); QCOMPARE(info->transitionTargets(transitions.at(1)).at(0), states.at(1)); + QCOMPARE(info->transitionEvents(transitions.at(1)).size(), 1); + QCOMPARE(info->transitionEvents(transitions.at(1)).at(0), QStringLiteral("step")); // a->theEnd QCOMPARE(info->transitionType(transitions.at(2)), QScxmlStateMachineInfo::ExternalTransition); QCOMPARE(info->transitionSource(transitions.at(2)), states.at(2)); QCOMPARE(info->transitionTargets(transitions.at(2)).size(), 1); QCOMPARE(info->transitionTargets(transitions.at(2)).at(0), states.at(4)); + QCOMPARE(info->transitionEvents(transitions.at(2)).size(), 1); + QCOMPARE(info->transitionEvents(transitions.at(2)).at(0), QStringLiteral("step")); // b->theEnd QCOMPARE(info->transitionType(transitions.at(3)), QScxmlStateMachineInfo::InternalTransition); QCOMPARE(info->transitionSource(transitions.at(3)), states.at(3)); QCOMPARE(info->transitionTargets(transitions.at(3)).size(), 1); QCOMPARE(info->transitionTargets(transitions.at(3)).at(0), states.at(4)); + QCOMPARE(info->transitionEvents(transitions.at(3)).size(), 1); + QCOMPARE(info->transitionEvents(transitions.at(3)).at(0), QStringLiteral("step")); // initial transition that activates the first (anonymous) state QCOMPARE(info->transitionType(transitions.at(4)), QScxmlStateMachineInfo::SyntheticTransition); @@ -147,6 +154,7 @@ void tst_StateMachineInfo::checkInfo() QScxmlStateMachineInfo::StateMachineRootState); QCOMPARE(info->transitionTargets(transitions.at(4)).size(), 1); QCOMPARE(info->transitionTargets(transitions.at(4)).at(0), states.at(0)); + QCOMPARE(info->transitionEvents(transitions.at(4)).size(), 0); // "initial" transition in the next state that activates all sub-states QCOMPARE(info->transitionType(transitions.at(5)), QScxmlStateMachineInfo::SyntheticTransition); @@ -154,6 +162,7 @@ void tst_StateMachineInfo::checkInfo() QCOMPARE(info->transitionTargets(transitions.at(5)).size(), 2); QCOMPARE(info->transitionTargets(transitions.at(5)).at(0), states.at(2)); QCOMPARE(info->transitionTargets(transitions.at(5)).at(1), states.at(3)); + QCOMPARE(info->transitionEvents(transitions.at(5)).size(), 0); Recorder recorder; QObject::connect(info, &QScxmlStateMachineInfo::statesEntered, -- cgit v1.2.3