diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2023-08-28 18:40:38 +0200 |
---|---|---|
committer | Ivan Solovev <ivan.solovev@qt.io> | 2023-10-06 12:55:12 +0200 |
commit | 77b44612e8898657bd235156b9872c12ca4aea80 (patch) | |
tree | 48b91fa286d66128480962939f91bc1d4670f831 /tests/auto | |
parent | 205e3da5ec7899f325f88ce0e5e7497bba6a046b (diff) |
QScxmlStateMachine: adjust the test and fix binding loops
Adjust to the changes in QTestPrivate that allow to catch binding loops
when testing bindable properties.
Fix the binding loops identified by the updated tests.
After fixing all obvious binding loops, it was discovered that the
call to QObject::objectName() in the tableData property setter creates
a binding loop on its own.
Fix it by accessing QObjectPrivate's internals instead of calling
a public getter.
Also add a test to verify that the logic of updating the objectName
did not change.
Task-number: QTBUG-116542
Pick-to: 6.6 6.5
Change-Id: Idc849dd9841dc70df2d36524cb5bb0a331255f39
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/statemachine/tst_statemachine.cpp | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/tests/auto/statemachine/tst_statemachine.cpp b/tests/auto/statemachine/tst_statemachine.cpp index 5b717e9..6080d42 100644 --- a/tests/auto/statemachine/tst_statemachine.cpp +++ b/tests/auto/statemachine/tst_statemachine.cpp @@ -38,6 +38,8 @@ private Q_SLOTS: void logWithoutExpr(); void bindings(); + + void setTableDataUpdatesObjectNames(); }; void tst_StateMachine::stateNames_data() @@ -449,11 +451,16 @@ void tst_StateMachine::bindings() return; } + using StateMachinePtr = std::unique_ptr<QScxmlStateMachine>; + // -- QScxmlStateMachine::initialValues QVariantMap map1{{"map", 1}}; QVariantMap map2{{"map", 2}}; QTestPrivate::testReadWritePropertyBasics<QScxmlStateMachine, QVariantMap>( - *stateMachine1, map1, map2, "initialValues"); + *stateMachine1, map1, map2, "initialValues", + []() { + return StateMachinePtr{QScxmlStateMachine::fromFile(QString("not_a_real_file"))}; + }); if (QTest::currentTestFailed()) { qWarning() << "QScxmlStateMachine::initialValues bindable test failed."; return; @@ -468,7 +475,10 @@ void tst_StateMachine::bindings() MockLoader loader1; MockLoader loader2; QTestPrivate::testReadWritePropertyBasics<QScxmlStateMachine, QScxmlCompiler::Loader*>( - *stateMachine1, &loader1, &loader2, "loader"); + *stateMachine1, &loader1, &loader2, "loader", + []() { + return StateMachinePtr{QScxmlStateMachine::fromFile(QString("not_a_real_file"))}; + }); if (QTest::currentTestFailed()) { qWarning() << "QScxmlStateMachine::loader bindable test failed."; return; @@ -483,18 +493,25 @@ void tst_StateMachine::bindings() QScxmlNullDataModel model1; // data can only change once QTestPrivate::testWriteOncePropertyBasics<QScxmlStateMachine, QScxmlDataModel*>( - *stateMachine2, nullptr, &model1, "dataModel"); + *stateMachine2, nullptr, &model1, "dataModel", true, + []() { + return StateMachinePtr{QScxmlStateMachine::fromFile(QString("not_a_real_file"))}; + }); if (QTest::currentTestFailed()) { qWarning() << "QScxmlStateMachine::dataModel bindable test failed."; return; } // -- QScxmlStateMachine::tableData - // Use the statemachine to generate the tabledDatas for testing + // Use the statemachine to generate the tableData for testing std::unique_ptr<QScxmlStateMachine> stateMachine4( QScxmlStateMachine::fromFile(QString(":/tst_statemachine/invoke.scxml"))); QTestPrivate::testReadWritePropertyBasics<QScxmlStateMachine, QScxmlTableData*>( - *stateMachine2, stateMachine1.get()->tableData(), stateMachine4.get()->tableData(), "tableData"); + *stateMachine2, stateMachine1.get()->tableData(), stateMachine4.get()->tableData(), + "tableData", + []() { + return StateMachinePtr{QScxmlStateMachine::fromFile(QString("not_a_real_file"))}; + }); if (QTest::currentTestFailed()) { qWarning() << "QScxmlStateMachine::tableData bindable test failed."; return; @@ -528,7 +545,7 @@ void tst_StateMachine::bindings() std::unique_ptr<QScxmlStateMachine> stateMachine5( QScxmlStateMachine::fromFile(QString("not_a_real_file"))); // data can only change once - QTestPrivate::testWriteOncePropertyBasics<QScxmlDataModel, QScxmlStateMachine*>( + QTestPrivate::testWriteOncePropertyBasics<QScxmlNullDataModel, QScxmlStateMachine*>( dataModel1, nullptr, stateMachine5.get(), "stateMachine"); if (QTest::currentTestFailed()) { qWarning() << "QScxmlDataModel::stateMachine bindable test failed."; @@ -536,6 +553,28 @@ void tst_StateMachine::bindings() } } +void tst_StateMachine::setTableDataUpdatesObjectNames() +{ + std::unique_ptr<QScxmlStateMachine> stateMachine1( + QScxmlStateMachine::fromFile(QString(":/tst_statemachine/emptylog.scxml"))); + const QString sm1ObjectName = stateMachine1->objectName(); + std::unique_ptr<QScxmlStateMachine> stateMachine2( + QScxmlStateMachine::fromFile(QString(":/tst_statemachine/eventoccurred.scxml"))); + const QString sm2ObjectName = stateMachine2->objectName(); + QCOMPARE_NE(sm1ObjectName, sm2ObjectName); + + std::unique_ptr<QScxmlStateMachine> sm( + QScxmlStateMachine::fromFile(QString("not_a_real_file"))); + QVERIFY(sm->objectName().isEmpty()); + // no name set, so update object name + sm->setTableData(stateMachine1->tableData()); + QCOMPARE_EQ(sm->objectName(), sm1ObjectName); + + // object name already set, so do not update + sm->setTableData(stateMachine2->tableData()); + QCOMPARE_EQ(sm->objectName(), sm1ObjectName); // did not change +} + QTEST_MAIN(tst_StateMachine) #include "tst_statemachine.moc" |