aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorThomas Hartmann <Thomas.Hartmann@nokia.com>2010-09-02 15:44:27 +0200
committerThomas Hartmann <Thomas.Hartmann@nokia.com>2010-09-07 16:31:22 +0200
commit7d6f181523b702536aa2d5b856915d5261f02c15 (patch)
tree9c2d8c96f057bf03de7138c678ca27c1835c0c0f /tests
parent226e089d1834a07f966f5165633593d0f9015f6c (diff)
QuickDesigner.tests: stress test for bindings in states
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp105
-rw-r--r--tests/auto/qml/qmldesigner/coretests/tst_testcore.h1
2 files changed, 105 insertions, 1 deletions
diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp
index 09e3d0e6b8f..dc219322489 100644
--- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp
+++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp
@@ -4720,7 +4720,110 @@ void tst_TestCore::testInstancesNotInScene()
node1.destroy();
}
-void tst_TestCore::testQmlModelStatesInvalidForRemovedNodes()
+void TestCore::testInstancesBindingsInStatesStress()
+{
+ //This is a stress test to provoke a crash
+ for (int j=0;j<20;j++) {
+ QScopedPointer<Model> model(Model::create("Qt/Rectangle", 4, 7));
+ QVERIFY(model.data());
+ QScopedPointer<TestView> view(new TestView);
+ QVERIFY(view.data());
+ model->attachView(view.data());
+
+ ModelNode node1 = view->createModelNode("Qt/Item", 4, 7);
+ node1.setId("node1");
+
+ view->rootModelNode().nodeListProperty("children").reparentHere(node1);
+
+ ModelNode node2 = view->createModelNode("Qt/Rectangle", 4, 7);
+ node2.setId("node2");
+
+ ModelNode node3 = view->createModelNode("Qt/Rectangle", 4, 7);
+ node3.setId("node3");
+
+ node1.nodeListProperty("children").reparentHere(node2);
+ node1.nodeListProperty("children").reparentHere(node3);
+
+ QmlItemNode(node1).states().addState("state1");
+ QmlItemNode(node1).states().addState("state2");
+
+ QmlItemNode(node1).setVariantProperty("x", "100");
+ QmlItemNode(node1).setVariantProperty("y", "100");
+
+
+ for (int i=0;i<4;i++) {
+ view->setCurrentState(view->baseState());
+
+ QmlItemNode(node2).setBindingProperty("x", "parent.x + 10");
+ QCOMPARE(QmlItemNode(node2).instanceValue("x").toInt(), 110);
+ view->setCurrentState(QmlItemNode(node1).states().state("state1"));
+ QmlItemNode(node2).setBindingProperty("x", "parent.x + 20");
+ QCOMPARE(QmlItemNode(node2).instanceValue("x").toInt(), 120);
+ QmlItemNode(node2).setBindingProperty("y", "parent.x + 20");
+ QCOMPARE(QmlItemNode(node2).instanceValue("y").toInt(), 120);
+
+ view->setCurrentState(QmlItemNode(node1).states().state("state2"));
+ QmlItemNode(node2).setBindingProperty("x", "parent.x + 30");
+ QCOMPARE(QmlItemNode(node2).instanceValue("x").toInt(), 130);
+ QmlItemNode(node2).setBindingProperty("y", "parent.x + 30");
+ QCOMPARE(QmlItemNode(node2).instanceValue("y").toInt(), 130);
+ QmlItemNode(node2).setBindingProperty("height", "this.is.no.proper.expression / 12 + 4");
+ QmlItemNode(node2).setVariantProperty("height", 0);
+
+
+ for (int c=0;c<10;c++) {
+ view->setCurrentState(QmlItemNode(node1).states().state("state1"));
+ QmlItemNode(node2).setBindingProperty("x", "parent.x + 20");
+ QmlItemNode(node2).setVariantProperty("x", "90");
+ QCOMPARE(QmlItemNode(node2).instanceValue("x").toInt(), 90);
+ QmlItemNode(node2).setBindingProperty("y", "parent.x + 20");
+ QmlItemNode(node2).setVariantProperty("y", "90");
+ view->setCurrentState(QmlItemNode(node1).states().state("state2"));
+ view->setCurrentState(view->baseState());
+ view->setCurrentState(QmlItemNode(node1).states().state("state1"));
+ QCOMPARE(QmlItemNode(node2).instanceValue("y").toInt(), 90);
+ QmlItemNode(node2).setBindingProperty("width", "parent.x + 30");
+ QCOMPARE(QmlItemNode(node2).instanceValue("width").toInt(), 130);
+ QmlItemNode(node2).setVariantProperty("width", "0");
+ view->setCurrentState(QmlItemNode(node1).states().state("state2"));
+ view->setCurrentState(view->baseState());
+ QmlItemNode(node1).setVariantProperty("x", "80");
+ QmlItemNode(node1).setVariantProperty("y", "80");
+ QmlItemNode(node1).setVariantProperty("x", "100");
+ QmlItemNode(node1).setVariantProperty("y", "100");
+ }
+
+ QmlItemNode(node3).setBindingProperty("width", "parent.x + 30");
+ QCOMPARE(QmlItemNode(node3).instanceValue("width").toInt(), 130);
+
+ view->setCurrentState(view->baseState());
+ QmlItemNode(node1).setVariantProperty("x", "80");
+ QmlItemNode(node1).setVariantProperty("y", "80");
+
+ view->setCurrentState(QmlItemNode(node1).states().state("state2"));
+
+ view->setCurrentState(QmlItemNode(node1).states().state("state1"));
+ QmlItemNode(node3).setVariantProperty("width", "90");
+
+ view->setCurrentState(QmlItemNode(node1).states().state(""));
+ view->setCurrentState(view->baseState());
+ QVERIFY(view->currentState().isBaseState());
+
+ QmlItemNode(node1).setVariantProperty("x", "100");
+ QmlItemNode(node1).setVariantProperty("y", "100");
+
+ QCOMPARE(QmlItemNode(node2).instanceValue("x").toInt(), 110);
+ QmlItemNode(node2).setBindingProperty("x", "parent.x + 20");
+ QCOMPARE(QmlItemNode(node2).instanceValue("x").toInt(), 120);
+ QmlItemNode(node2).setVariantProperty("x", "80");
+ QCOMPARE(QmlItemNode(node2).instanceValue("x").toInt(), 80);
+ view->setCurrentState(QmlItemNode(node1).states().state("state1"));
+ QCOMPARE(QmlItemNode(node2).instanceValue("x").toInt(), 90);
+ }
+ }
+}
+
+void TestCore::testQmlModelStatesInvalidForRemovedNodes()
{
QScopedPointer<Model> model(Model::create("Qt/Rectangle", 4, 7));
QVERIFY(model.data());
diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.h b/tests/auto/qml/qmldesigner/coretests/tst_testcore.h
index 1ee76cd4973..6ed6091e189 100644
--- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.h
+++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.h
@@ -149,6 +149,7 @@ private slots:
void testInstancesStates();
void testInstancesIdResolution();
void testInstancesNotInScene();
+ void testInstancesBindingsInStates();
//
// integration tests