From 9b492331da490479d36ac5b658f6e31ba606e4e4 Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Thu, 16 Sep 2010 09:26:29 +0200
Subject: [PATCH] Adding LowLevel units test for instances

testing data, children and resources properties
---
 .../qmldesigner/coretests/tst_testcore.cpp    | 426 +++++++++++++++++-
 .../qml/qmldesigner/coretests/tst_testcore.h  |   4 +
 2 files changed, 429 insertions(+), 1 deletion(-)

diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp
index c5e6905b1ec..2a4b4ca697f 100644
--- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp
+++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp
@@ -55,6 +55,7 @@
 #include <nodelistproperty.h>
 #include <nodeabstractproperty.h>
 #include <componenttextmodifier.h>
+#include <instances/objectnodeinstance.h>
 
 #include <bytearraymodifier.h>
 #include "testrewriterview.h"
@@ -64,6 +65,7 @@
 #include <QPlainTextEdit>
 #include <private/qdeclarativestate_p.h>
 #include <private/qdeclarativemetatype_p.h>
+#include <QDeclarativeItem>
 
 //TESTED_COMPONENT=src/plugins/qmldesigner/designercore
 
@@ -5022,12 +5024,434 @@ void tst_TestCore::testInstancesDeletePropertyChanges()
 
 }
 
+void tst_TestCore::testInstancesChildrenLowLevel()
+{
+    QScopedPointer<Model> model(Model::create("Qt/Rectangle", 4, 7));
+    QVERIFY(model.data());
+
+    QScopedPointer<NodeInstanceView> view(new NodeInstanceView);
+    QVERIFY(view.data());
+    model->attachView(view.data());
+
+    ModelNode rootModelNode(view->rootModelNode());
+    QVERIFY(rootModelNode.isValid());
+
+    rootModelNode.setId("rootModelNode");
+
+    ModelNode childNode1 = addNodeListChild(rootModelNode, "Qt/Text", 4, 7, "data");
+    QVERIFY(childNode1.isValid());
+    childNode1.setId("childNode1");
+
+    ModelNode childNode2 = addNodeListChild(rootModelNode, "Qt/TextEdit", 4, 7, "data");
+    QVERIFY(childNode2.isValid());
+    childNode2.setId("childNode2");
+
+    NodeInstance rootInstance = view->instanceForNode(rootModelNode);
+    QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(rootInstance.testHandle());
+    QVERIFY(rootItem);
+    NodeInstance child1Instance = view->instanceForNode(childNode1);
+    QDeclarativeItem *child1Item = qobject_cast<QDeclarativeItem*>(child1Instance.testHandle());
+    QVERIFY(child1Item);
+    NodeInstance child2Instance = view->instanceForNode(childNode2);
+    QDeclarativeItem *child2Item = qobject_cast<QDeclarativeItem*>(child2Instance.testHandle());
+    QVERIFY(child2Item);
+
+     QDeclarativeContext *context = rootInstance.internalInstance()->context();
+     QDeclarativeEngine *engine = rootInstance.internalInstance()->engine();
+     QDeclarativeProperty childrenProperty(rootItem, "children", context);
+     QVERIFY(childrenProperty.isValid());
+     
+     QDeclarativeListReference listReference(childrenProperty.object(), childrenProperty.name().toLatin1(), engine);
+     QVERIFY(listReference.isValid());
+
+     QVERIFY(listReference.canAppend());
+     QVERIFY(listReference.canAt());
+     QVERIFY(listReference.canClear());
+     QVERIFY(listReference.canCount());
+
+     QCOMPARE(listReference.count(), 2);
+
+     QCOMPARE(listReference.at(0), child1Item);
+     QCOMPARE(listReference.at(1), child2Item);
+
+     listReference.clear();
+
+     QCOMPARE(listReference.count(), 0);
+
+     listReference.append(child2Item);
+     listReference.append(child1Item);
+
+     QCOMPARE(listReference.at(0), child2Item);
+     QCOMPARE(listReference.at(1), child1Item);
+
+     QDeclarativeProperty dataProperty(rootItem, "data", context);
+     QDeclarativeListReference listReferenceData(dataProperty.object(), dataProperty.name().toLatin1(), engine);
+
+     QVERIFY(listReferenceData.canAppend());
+     QVERIFY(listReferenceData.canAt());
+     QVERIFY(listReferenceData.canClear());
+     QVERIFY(listReferenceData.canCount());
+
+     QCOMPARE(listReferenceData.count(), 2);
+
+     QCOMPARE(listReferenceData.at(0), child2Item);
+     QCOMPARE(listReferenceData.at(1), child1Item);
+
+     listReferenceData.clear();
+
+     QCOMPARE(listReference.count(), 0);
+     QCOMPARE(listReferenceData.count(), 0);
+
+     listReferenceData.append(child1Item);
+     listReferenceData.append(child2Item);
+
+     QCOMPARE(listReferenceData.count(), 2);
+
+     QCOMPARE(listReference.at(0), child1Item);
+     QCOMPARE(listReference.at(1), child2Item);
+
+     QCOMPARE(listReferenceData.at(0), child1Item);
+     QCOMPARE(listReferenceData.at(1), child2Item);
+}
+
+void tst_TestCore::testInstancesResourcesLowLevel()
+{
+    QScopedPointer<Model> model(Model::create("Qt/Rectangle", 4, 7));
+    QVERIFY(model.data());
+
+    QScopedPointer<NodeInstanceView> view(new NodeInstanceView);
+    QVERIFY(view.data());
+    model->attachView(view.data());
+
+    ModelNode rootModelNode(view->rootModelNode());
+    QVERIFY(rootModelNode.isValid());
+
+    rootModelNode.setId("rootModelNode");
+
+    ModelNode childNode1 = addNodeListChild(rootModelNode, "Qt/Text", 4, 7, "data");
+    QVERIFY(childNode1.isValid());
+    childNode1.setId("childNode1");
+
+    ModelNode childNode2 = addNodeListChild(rootModelNode, "Qt/TextEdit", 4, 7, "data");
+    QVERIFY(childNode2.isValid());
+    childNode2.setId("childNode2");
+
+    ModelNode listModel = addNodeListChild(rootModelNode, "Qt/ListModel", 4, 7, "data");
+    QVERIFY(listModel.isValid());
+    listModel.setId("listModel");
+
+    NodeInstance rootInstance = view->instanceForNode(rootModelNode);
+    QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(rootInstance.testHandle());
+    QVERIFY(rootItem);
+    NodeInstance child1Instance = view->instanceForNode(childNode1);
+    QDeclarativeItem *child1Item = qobject_cast<QDeclarativeItem*>(child1Instance.testHandle());
+    QVERIFY(child1Item);
+    NodeInstance child2Instance = view->instanceForNode(childNode2);
+    QDeclarativeItem *child2Item = qobject_cast<QDeclarativeItem*>(child2Instance.testHandle());
+    QVERIFY(child2Item);
+
+    NodeInstance listModelInstance = view->instanceForNode(listModel);
+    QObject *listModelObject = listModelInstance.testHandle();
+    QVERIFY(listModelObject);
+
+    QDeclarativeContext *context = rootInstance.internalInstance()->context();
+    QDeclarativeEngine *engine = rootInstance.internalInstance()->engine();
+    QDeclarativeProperty childrenProperty(rootItem, "children", context);
+    QDeclarativeProperty resourcesProperty(rootItem, "resources", context);
+    QDeclarativeProperty dataProperty(rootItem, "data", context);
+
+    QDeclarativeListReference listReferenceData(dataProperty.object(), dataProperty.name().toLatin1(), engine);
+    QDeclarativeListReference listReferenceChildren(childrenProperty.object(), childrenProperty.name().toLatin1(), engine);
+    QDeclarativeListReference listReferenceResources(resourcesProperty.object(), resourcesProperty.name().toLatin1(), engine);
+
+    QVERIFY(listReferenceData.isValid());
+    QVERIFY(listReferenceChildren.isValid());
+    QVERIFY(listReferenceResources.isValid());
+
+    QCOMPARE(listReferenceData.count(), 3);
+    QCOMPARE(listReferenceChildren.count(), 2);
+    QCOMPARE(listReferenceResources.count(), 1);
+
+    QCOMPARE(listReferenceResources.at(0), listModelObject);
+    QCOMPARE(listReferenceData.at(0), listModelObject);
+
+    listReferenceResources.clear();
+
+    QCOMPARE(listReferenceData.count(), 2);
+    QCOMPARE(listReferenceChildren.count(), 2);
+    QCOMPARE(listReferenceResources.count(), 0);
+
+    listReferenceData.append(listModelObject);
+
+    QCOMPARE(listReferenceData.count(), 3);
+    QCOMPARE(listReferenceChildren.count(), 2);
+    QCOMPARE(listReferenceResources.count(), 1);
+
+    QCOMPARE(listReferenceResources.at(0), listModelObject);
+    QCOMPARE(listReferenceData.at(0), listModelObject);
+    QCOMPARE(listReferenceData.at(1), child1Item);
+    QCOMPARE(listReferenceData.at(2), child2Item);
+
+    listReferenceChildren.clear();
+
+    QCOMPARE(listReferenceData.count(), 1);
+    QCOMPARE(listReferenceChildren.count(), 0);
+    QCOMPARE(listReferenceResources.count(), 1);
+
+    QCOMPARE(listReferenceResources.at(0), listModelObject);
+    QCOMPARE(listReferenceData.at(0), listModelObject);
+
+    listReferenceData.append(child1Item);
+    listReferenceData.append(child2Item);
+
+    QCOMPARE(listReferenceData.count(), 3);
+    QCOMPARE(listReferenceChildren.count(), 2);
+    QCOMPARE(listReferenceResources.count(), 1);
+
+    QCOMPARE(listReferenceResources.at(0), listModelObject);
+    QCOMPARE(listReferenceData.at(0), listModelObject);
+    QCOMPARE(listReferenceData.at(1), child1Item);
+    QCOMPARE(listReferenceData.at(2), child2Item);
+
+    ModelNode listModel2 = addNodeListChild(rootModelNode, "Qt/ListModel", 4, 7, "data");
+    QVERIFY(listModel2.isValid());
+    listModel2.setId("listModel2");
+
+    NodeInstance listModelInstance2 = view->instanceForNode(listModel2);
+    QObject *listModelObject2 = listModelInstance2.testHandle();
+    QVERIFY(listModelObject2);
+
+    QCOMPARE(listReferenceData.count(), 4);
+    QCOMPARE(listReferenceChildren.count(), 2);
+    QCOMPARE(listReferenceResources.count(), 2);
+
+    QCOMPARE(listReferenceResources.at(0), listModelObject);
+    QCOMPARE(listReferenceResources.at(1), listModelObject2);
+    QCOMPARE(listReferenceData.at(0), listModelObject);
+    QCOMPARE(listReferenceData.at(1), listModelObject2);
+    QCOMPARE(listReferenceData.at(2), child1Item);
+    QCOMPARE(listReferenceData.at(3), child2Item);
+
+    listReferenceResources.clear();
+
+    QCOMPARE(listReferenceChildren.count(), 2);
+    QCOMPARE(listReferenceData.count(), 2);
+    QCOMPARE(listReferenceResources.count(), 0);
+
+    listReferenceResources.append(listModelObject2);
+    listReferenceResources.append(listModelObject);
+
+    QCOMPARE(listReferenceData.count(), 4);
+    QCOMPARE(listReferenceChildren.count(), 2);
+    QCOMPARE(listReferenceResources.count(), 2);
+
+    QCOMPARE(listReferenceResources.at(0), listModelObject2);
+    QCOMPARE(listReferenceResources.at(1), listModelObject);
+    QCOMPARE(listReferenceData.at(0), listModelObject2);
+    QCOMPARE(listReferenceData.at(1), listModelObject);
+    QCOMPARE(listReferenceData.at(2), child1Item);
+    QCOMPARE(listReferenceData.at(3), child2Item);
+
+    listReferenceData.clear();
+
+    QCOMPARE(listReferenceChildren.count(), 0);
+    QCOMPARE(listReferenceData.count(), 0);
+    QCOMPARE(listReferenceResources.count(), 0);
+}
+
+void tst_TestCore::testInstancesFlickableLowLevel()
+{
+    QScopedPointer<Model> model(Model::create("Qt/Flickable", 4, 7));
+    QVERIFY(model.data());
+
+    QScopedPointer<NodeInstanceView> view(new NodeInstanceView);
+    QVERIFY(view.data());
+    model->attachView(view.data());
+
+    ModelNode rootModelNode(view->rootModelNode());
+    QVERIFY(rootModelNode.isValid());
+
+    rootModelNode.setId("rootModelNode");
+
+    ModelNode childNode1 = addNodeListChild(rootModelNode, "Qt/Text", 4, 7, "flickableData");
+    QVERIFY(childNode1.isValid());
+    childNode1.setId("childNode1");
+
+    ModelNode childNode2 = addNodeListChild(rootModelNode, "Qt/TextEdit", 4, 7, "flickableData");
+    QVERIFY(childNode2.isValid());
+    childNode2.setId("childNode2");
+
+    ModelNode listModel = addNodeListChild(rootModelNode, "Qt/ListModel", 4, 7, "flickableData");
+    QVERIFY(listModel.isValid());
+    listModel.setId("listModel");
+
+    NodeInstance rootInstance = view->instanceForNode(rootModelNode);
+    QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(rootInstance.testHandle());
+    QVERIFY(rootItem);
+    NodeInstance child1Instance = view->instanceForNode(childNode1);
+    QDeclarativeItem *child1Item = qobject_cast<QDeclarativeItem*>(child1Instance.testHandle());
+    QVERIFY(child1Item);
+    NodeInstance child2Instance = view->instanceForNode(childNode2);
+    QDeclarativeItem *child2Item = qobject_cast<QDeclarativeItem*>(child2Instance.testHandle());
+    QVERIFY(child2Item);
+
+    NodeInstance listModelInstance = view->instanceForNode(listModel);
+    QObject *listModelObject = listModelInstance.testHandle();
+    QVERIFY(listModelObject);
+
+    QDeclarativeContext *context = rootInstance.internalInstance()->context();
+    QDeclarativeEngine *engine = rootInstance.internalInstance()->engine();
+    QDeclarativeProperty flickableChildrenProperty(rootItem, "flickableChildren", context);
+    QDeclarativeProperty flickableDataProperty(rootItem, "flickableData", context);
+    QDeclarativeProperty dataProperty(rootItem, "data", context);
+    QDeclarativeProperty resourcesProperty(rootItem, "resources", context);
+    QDeclarativeProperty childrenProperty(rootItem, "children", context);
+
+    QDeclarativeListReference listReferenceData(dataProperty.object(), dataProperty.name().toLatin1(), engine);
+    QDeclarativeListReference listReferenceResources(resourcesProperty.object(), resourcesProperty.name().toLatin1(), engine);
+    QDeclarativeListReference listReferenceChildren(childrenProperty.object(), childrenProperty.name().toLatin1(), engine);
+    QDeclarativeListReference listReferenceFlickableData(flickableDataProperty.object(), flickableDataProperty.name().toLatin1(), engine);
+    QDeclarativeListReference listReferenceFlickableChildren(flickableChildrenProperty.object(), flickableChildrenProperty.name().toLatin1(), engine);
+
+    QVERIFY(listReferenceData.isValid());
+    QVERIFY(listReferenceChildren.isValid());
+    QVERIFY(listReferenceResources.isValid());
+    QVERIFY(listReferenceFlickableChildren.isValid());
+    QVERIFY(listReferenceFlickableData.isValid());
+
+    QCOMPARE(listReferenceChildren.count(), 1);
+    QCOMPARE(listReferenceFlickableChildren.count(), 2);
+    QCOMPARE(listReferenceData.count(), listReferenceResources.count() + listReferenceChildren.count());
+    QCOMPARE(listReferenceFlickableData.count(), listReferenceResources.count() + listReferenceFlickableChildren.count());
+    int oldResourcesCount = listReferenceResources.count();
+
+    QCOMPARE(listReferenceFlickableChildren.at(0), child1Item);
+    QCOMPARE(listReferenceFlickableChildren.at(1), child2Item);
+
+    listReferenceFlickableChildren.clear();
+
+    QCOMPARE(listReferenceFlickableChildren.count(), 0);
+    QCOMPARE(listReferenceResources.count(), oldResourcesCount);
+    QCOMPARE(listReferenceData.count(), listReferenceResources.count() + listReferenceChildren.count());
+    QCOMPARE(listReferenceFlickableData.count(), listReferenceResources.count() + listReferenceFlickableChildren.count());
+
+    listReferenceFlickableChildren.append(child2Item);
+    listReferenceFlickableChildren.append(child1Item);
+
+    QCOMPARE(listReferenceFlickableChildren.count(), 2);
+    QCOMPARE(listReferenceResources.count(), oldResourcesCount);
+    QCOMPARE(listReferenceData.count(), listReferenceResources.count() + listReferenceChildren.count());
+    QCOMPARE(listReferenceFlickableData.count(), listReferenceResources.count() + listReferenceFlickableChildren.count());
+
+    QCOMPARE(listReferenceFlickableChildren.at(0), child2Item);
+    QCOMPARE(listReferenceFlickableChildren.at(1), child1Item);
+}
+
+void tst_TestCore::testInstancesReorderChildrenLowLevel()
+{
+    QScopedPointer<Model> model(Model::create("Qt/Rectangle", 4, 7));
+    QVERIFY(model.data());
+
+    QScopedPointer<NodeInstanceView> view(new NodeInstanceView);
+    QVERIFY(view.data());
+    model->attachView(view.data());
+
+    ModelNode rootModelNode(view->rootModelNode());
+    QVERIFY(rootModelNode.isValid());
+
+    rootModelNode.setId("rootModelNode");
+
+    ModelNode childNode1 = addNodeListChild(rootModelNode, "Qt/Text", 4, 7, "data");
+    QVERIFY(childNode1.isValid());
+    childNode1.setId("childNode1");
+
+    ModelNode childNode2 = addNodeListChild(rootModelNode, "Qt/TextEdit", 4, 7, "data");
+    QVERIFY(childNode2.isValid());
+    childNode2.setId("childNode2");
+
+    ModelNode listModel = addNodeListChild(rootModelNode, "Qt/ListModel", 4, 7, "data");
+    QVERIFY(listModel.isValid());
+    listModel.setId("listModel");
+
+    ModelNode childNode3 = addNodeListChild(rootModelNode, "Qt/TextEdit", 4, 7, "data");
+    QVERIFY(childNode3.isValid());
+    childNode3.setId("childNode3");
+
+    ModelNode childNode4 = addNodeListChild(rootModelNode, "Qt/TextEdit", 4, 7, "data");
+    QVERIFY(childNode4.isValid());
+    childNode4.setId("childNode4");
+
+    NodeInstance rootInstance = view->instanceForNode(rootModelNode);
+    QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(rootInstance.testHandle());
+    QVERIFY(rootItem);
+    NodeInstance child1Instance = view->instanceForNode(childNode1);
+    QDeclarativeItem *child1Item = qobject_cast<QDeclarativeItem*>(child1Instance.testHandle());
+    QVERIFY(child1Item);
+    NodeInstance child2Instance = view->instanceForNode(childNode2);
+    QDeclarativeItem *child2Item = qobject_cast<QDeclarativeItem*>(child2Instance.testHandle());
+    QVERIFY(child2Item);
+    NodeInstance child3Instance = view->instanceForNode(childNode3);
+    QDeclarativeItem *child3Item = qobject_cast<QDeclarativeItem*>(child3Instance.testHandle());
+    QVERIFY(child3Item);
+    NodeInstance child4Instance = view->instanceForNode(childNode4);
+    QDeclarativeItem *child4Item = qobject_cast<QDeclarativeItem*>(child4Instance.testHandle());
+    QVERIFY(child4Item);
+
+    NodeInstance listModelInstance = view->instanceForNode(listModel);
+    QObject *listModelObject = listModelInstance.testHandle();
+    QVERIFY(listModelObject);
+
+    QDeclarativeContext *context = rootInstance.internalInstance()->context();
+    QDeclarativeEngine *engine = rootInstance.internalInstance()->engine();
+    QDeclarativeProperty childrenProperty(rootItem, "children", context);
+    QDeclarativeProperty resourcesProperty(rootItem, "resources", context);
+    QDeclarativeProperty dataProperty(rootItem, "data", context);
+
+    QDeclarativeListReference listReferenceData(dataProperty.object(), dataProperty.name().toLatin1(), engine);
+    QDeclarativeListReference listReferenceChildren(childrenProperty.object(), childrenProperty.name().toLatin1(), engine);
+    QDeclarativeListReference listReferenceResources(resourcesProperty.object(), resourcesProperty.name().toLatin1(), engine);
+
+    QVERIFY(listReferenceData.isValid());
+    QVERIFY(listReferenceChildren.isValid());
+    QVERIFY(listReferenceResources.isValid());
+
+    QCOMPARE(listReferenceResources.count(), 1);
+    QCOMPARE(listReferenceChildren.count(), 4);
+    QCOMPARE(listReferenceData.count(), 5);
+
+    QCOMPARE(listReferenceChildren.at(0), child1Item);
+    QCOMPARE(listReferenceChildren.at(1), child2Item);
+    QCOMPARE(listReferenceChildren.at(2), child3Item);
+    QCOMPARE(listReferenceChildren.at(3), child4Item);
+
+    listReferenceChildren.clear();
+
+    QCOMPARE(listReferenceResources.count(), 1);
+    QCOMPARE(listReferenceChildren.count(), 0);
+    QCOMPARE(listReferenceData.count(), 1);
+
+    listReferenceChildren.append(child4Item);
+    listReferenceChildren.append(child3Item);
+    listReferenceChildren.append(child2Item);
+    listReferenceChildren.append(child1Item);
+
+
+    QCOMPARE(listReferenceResources.count(), 1);
+    QCOMPARE(listReferenceChildren.count(), 4);
+    QCOMPARE(listReferenceData.count(), 5);
+
+    QCOMPARE(listReferenceChildren.at(0), child4Item);
+    QCOMPARE(listReferenceChildren.at(1), child3Item);
+    QCOMPARE(listReferenceChildren.at(2), child2Item);
+    QCOMPARE(listReferenceChildren.at(3), child1Item);
+}
+
 void tst_TestCore::testQmlModelStatesInvalidForRemovedNodes()
 {
     QScopedPointer<Model> model(Model::create("Qt/Rectangle", 4, 7));
     QVERIFY(model.data());
 
-    QScopedPointer<TestView> view(new TestView);
+    QScopedPointer<TestView> view(new TestView(model.data()));
     QVERIFY(view.data());
     model->attachView(view.data());
 
diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.h b/tests/auto/qml/qmldesigner/coretests/tst_testcore.h
index 1904f7246eb..0e5cc280cd2 100644
--- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.h
+++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.h
@@ -152,6 +152,10 @@ private slots:
     void testInstancesBindingsInStatesStress();
     void testInstancesPropertyChangeTargets();
     void testInstancesDeletePropertyChanges();
+    void testInstancesChildrenLowLevel();
+    void testInstancesResourcesLowLevel();
+    void testInstancesFlickableLowLevel();
+    void testInstancesReorderChildrenLowLevel();
 
     //
     // integration tests
-- 
GitLab