summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/statemachine
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@theqtcompany.com>2015-04-22 12:24:16 +0200
committerErik Verbruggen <erik.verbruggen@theqtcompany.com>2015-05-07 15:37:17 +0000
commiteb4bf7df60a95028e33c721f249ab328738ac462 (patch)
tree38d701d1005a0db24c66207c6c45fd913330fc3c /tests/auto/corelib/statemachine
parente46b6db98631804c4c2a79af764190c98c408fb7 (diff)
QStateMachine: Fix transition ordering.
When there are conflicting transitions, a transition that is nested deeper (i.e. more specific) has priority. If two transitions have the same nesting level, the one that comes first in the document order gets priority. Before this patch, only the document order was considered. Change-Id: I58f188c270cabe2c386a783ceef7a0a955105425 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
Diffstat (limited to 'tests/auto/corelib/statemachine')
-rw-r--r--tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
index 6ddfb828e8..3718b07b33 100644
--- a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
+++ b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
@@ -248,6 +248,7 @@ private slots:
void qtbug_44963();
void qtbug_44783();
void internalTransition();
+ void conflictingTransition();
};
class TestState : public QState
@@ -6382,5 +6383,68 @@ void tst_QStateMachine::internalTransition()
TEST_ACTIVE_CHANGED(s, 1);
}
+void tst_QStateMachine::conflictingTransition()
+{
+ SignalEmitter emitter;
+
+ QStateMachine machine;
+ QState b(QState::ParallelStates, &machine);
+ QState c(&b);
+ QState d(QState::ParallelStates, &b);
+ QState e(&d);
+ QState e1(&e);
+ QState e2(&e);
+ QState f(&d);
+ QState f1(&f);
+ QState f2(&f);
+ QState a1(&machine);
+
+ machine.setInitialState(&b);
+ e.setInitialState(&e1);
+ f.setInitialState(&f1);
+ c.addTransition(&emitter, SIGNAL(signalWithNoArg()), &a1)->setObjectName("c->a1");
+ e1.addTransition(&emitter, SIGNAL(signalWithNoArg()), &e2)->setObjectName("e1->e2");
+ f1.addTransition(&emitter, SIGNAL(signalWithNoArg()), &f2)->setObjectName("f1->f2");
+
+ b.setObjectName("b");
+ c.setObjectName("c");
+ d.setObjectName("d");
+ e.setObjectName("e");
+ e1.setObjectName("e1");
+ e2.setObjectName("e2");
+ f.setObjectName("f");
+ f1.setObjectName("f1");
+ f2.setObjectName("f2");
+ a1.setObjectName("a1");
+
+ machine.start();
+
+ QTRY_COMPARE(machine.configuration().contains(&b), true);
+ QTRY_COMPARE(machine.configuration().contains(&c), true);
+ QTRY_COMPARE(machine.configuration().contains(&d), true);
+ QTRY_COMPARE(machine.configuration().contains(&e), true);
+ QTRY_COMPARE(machine.configuration().contains(&e1), true);
+ QTRY_COMPARE(machine.configuration().contains(&e2), false);
+ QTRY_COMPARE(machine.configuration().contains(&f), true);
+ QTRY_COMPARE(machine.configuration().contains(&f1), true);
+ QTRY_COMPARE(machine.configuration().contains(&f2), false);
+ QTRY_COMPARE(machine.configuration().contains(&a1), false);
+
+ emitter.emitSignalWithNoArg();
+
+ QTRY_COMPARE(machine.configuration().contains(&b), true);
+ QTRY_COMPARE(machine.configuration().contains(&c), true);
+ QTRY_COMPARE(machine.configuration().contains(&d), true);
+ QTRY_COMPARE(machine.configuration().contains(&e), true);
+ QTRY_COMPARE(machine.configuration().contains(&e1), false);
+ QTRY_COMPARE(machine.configuration().contains(&e2), true);
+ QTRY_COMPARE(machine.configuration().contains(&f), true);
+ QTRY_COMPARE(machine.configuration().contains(&f1), false);
+ QTRY_COMPARE(machine.configuration().contains(&f2), true);
+ QTRY_COMPARE(machine.configuration().contains(&a1), false);
+
+ QVERIFY(machine.isRunning());
+}
+
QTEST_MAIN(tst_QStateMachine)
#include "tst_qstatemachine.moc"