From 12a5ddf456ba8549645a8cb28a8b4ed6197a14da Mon Sep 17 00:00:00 2001 From: Matthew Vogt Date: Mon, 30 Jan 2012 14:16:15 +1000 Subject: Import relevant source from Qt 4.8 Change-Id: I5078db4081d95290c54f39d3c0efc2fc2f62e6a6 --- .../qdeclarativedom/data/MyComponent.qml | 4 + .../declarative/qdeclarativedom/data/MyItem.qml | 4 + .../qdeclarativedom/data/import/Bar.qml | 2 + .../qdeclarativedom/data/importlib/sublib/Foo.qml | 2 + .../qdeclarativedom/data/importlib/sublib/qmldir | 2 + .../auto/declarative/qdeclarativedom/data/top.qml | 6 + .../qdeclarativedom/qdeclarativedom.pro | 16 + .../qdeclarativedom/tst_qdeclarativedom.cpp | 1326 ++++++++++++++++++++ 8 files changed, 1362 insertions(+) create mode 100644 tests/auto/declarative/qdeclarativedom/data/MyComponent.qml create mode 100644 tests/auto/declarative/qdeclarativedom/data/MyItem.qml create mode 100644 tests/auto/declarative/qdeclarativedom/data/import/Bar.qml create mode 100644 tests/auto/declarative/qdeclarativedom/data/importlib/sublib/Foo.qml create mode 100644 tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir create mode 100644 tests/auto/declarative/qdeclarativedom/data/top.qml create mode 100644 tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro create mode 100644 tests/auto/declarative/qdeclarativedom/tst_qdeclarativedom.cpp (limited to 'tests/auto/declarative/qdeclarativedom') diff --git a/tests/auto/declarative/qdeclarativedom/data/MyComponent.qml b/tests/auto/declarative/qdeclarativedom/data/MyComponent.qml new file mode 100644 index 00000000..f6760b6a --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/data/MyComponent.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +Item { +} diff --git a/tests/auto/declarative/qdeclarativedom/data/MyItem.qml b/tests/auto/declarative/qdeclarativedom/data/MyItem.qml new file mode 100644 index 00000000..f6760b6a --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/data/MyItem.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +Item { +} diff --git a/tests/auto/declarative/qdeclarativedom/data/import/Bar.qml b/tests/auto/declarative/qdeclarativedom/data/import/Bar.qml new file mode 100644 index 00000000..86a71768 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/data/import/Bar.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 + diff --git a/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/Foo.qml b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/Foo.qml new file mode 100644 index 00000000..86a71768 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/Foo.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 + diff --git a/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir new file mode 100644 index 00000000..98d6b743 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir @@ -0,0 +1,2 @@ +Foo 1.1 Foo.qml +Foo 1.0 Foo.qml diff --git a/tests/auto/declarative/qdeclarativedom/data/top.qml b/tests/auto/declarative/qdeclarativedom/data/top.qml new file mode 100644 index 00000000..56ea9dfa --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/data/top.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +MyComponent { + width: 100 + height: 100 +} diff --git a/tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro b/tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro new file mode 100644 index 00000000..8ac69aac --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativedom.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativedom/tst_qdeclarativedom.cpp b/tests/auto/declarative/qdeclarativedom/tst_qdeclarativedom.cpp new file mode 100644 index 00000000..14f1fb50 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/tst_qdeclarativedom.cpp @@ -0,0 +1,1326 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include + +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativedom : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativedom() {} + +private slots: + void loadSimple(); + void loadProperties(); + void loadGroupedProperties(); + void loadChildObject(); + void loadComposite(); + void loadImports(); + void loadErrors(); + void loadSyntaxErrors(); + void loadRemoteErrors(); + void loadDynamicProperty(); + void loadComponent(); + + void testValueSource(); + void testValueInterceptor(); + + void object_dynamicProperty(); + void object_property(); + void object_url(); + + void copy(); + void position(); +private: + QDeclarativeEngine engine; +}; + + +void tst_qdeclarativedom::loadSimple() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Item {}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + QVERIFY(document.errors().isEmpty()); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + QVERIFY(!rootObject.isComponent()); + QVERIFY(!rootObject.isCustomType()); + QVERIFY(rootObject.objectType() == "QtQuick/Item"); + QVERIFY(rootObject.objectTypeMajorVersion() == 1); + QVERIFY(rootObject.objectTypeMinorVersion() == 0); +} + +// Test regular properties +void tst_qdeclarativedom::loadProperties() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Item { id : item; x : 300; visible : true }"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + QVERIFY(rootObject.objectId() == "item"); + QCOMPARE(rootObject.properties().size(), 3); + + QDeclarativeDomProperty xProperty = rootObject.property("x"); + QVERIFY(xProperty.propertyName() == "x"); + QCOMPARE(xProperty.propertyNameParts().count(), 1); + QVERIFY(xProperty.propertyNameParts().at(0) == "x"); + QCOMPARE(xProperty.position(), 37); + QCOMPARE(xProperty.length(), 1); + QVERIFY(xProperty.value().isLiteral()); + QVERIFY(xProperty.value().toLiteral().literal() == "300"); + + QDeclarativeDomProperty visibleProperty = rootObject.property("visible"); + QVERIFY(visibleProperty.propertyName() == "visible"); + QCOMPARE(visibleProperty.propertyNameParts().count(), 1); + QVERIFY(visibleProperty.propertyNameParts().at(0) == "visible"); + QCOMPARE(visibleProperty.position(), 46); + QCOMPARE(visibleProperty.length(), 7); + QVERIFY(visibleProperty.value().isLiteral()); + QVERIFY(visibleProperty.value().toLiteral().literal() == "true"); +} + +// Test grouped properties +void tst_qdeclarativedom::loadGroupedProperties() +{ + { + QByteArray qml = "import QtQuick 1.0\n" + "Item { anchors.left: parent.left; anchors.right: parent.right }"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QVERIFY(rootItem.properties().size() == 2); + + // Order is not deterministic + QDeclarativeDomProperty p0 = rootItem.properties().at(0); + QDeclarativeDomProperty p1 = rootItem.properties().at(1); + QDeclarativeDomProperty leftProperty; + QDeclarativeDomProperty rightProperty; + if (p0.propertyName() == "anchors.left") { + leftProperty = p0; + rightProperty = p1; + } else { + leftProperty = p1; + rightProperty = p0; + } + + QVERIFY(leftProperty.propertyName() == "anchors.left"); + QCOMPARE(leftProperty.propertyNameParts().count(), 2); + QVERIFY(leftProperty.propertyNameParts().at(0) == "anchors"); + QVERIFY(leftProperty.propertyNameParts().at(1) == "left"); + QCOMPARE(leftProperty.position(), 26); + QCOMPARE(leftProperty.length(), 12); + QVERIFY(leftProperty.value().isBinding()); + QVERIFY(leftProperty.value().toBinding().binding() == "parent.left"); + + QVERIFY(rightProperty.propertyName() == "anchors.right"); + QCOMPARE(rightProperty.propertyNameParts().count(), 2); + QVERIFY(rightProperty.propertyNameParts().at(0) == "anchors"); + QVERIFY(rightProperty.propertyNameParts().at(1) == "right"); + QCOMPARE(rightProperty.position(), 53); + QCOMPARE(rightProperty.length(), 13); + QVERIFY(rightProperty.value().isBinding()); + QVERIFY(rightProperty.value().toBinding().binding() == "parent.right"); + } + + { + QByteArray qml = "import QtQuick 1.0\n" + "Item { \n" + " anchors {\n" + " left: parent.left\n" + " right: parent.right\n" + " }\n" + "}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QVERIFY(rootItem.properties().size() == 2); + + // Order is not deterministic + QDeclarativeDomProperty p0 = rootItem.properties().at(0); + QDeclarativeDomProperty p1 = rootItem.properties().at(1); + QDeclarativeDomProperty leftProperty; + QDeclarativeDomProperty rightProperty; + if (p0.propertyName() == "anchors.left") { + leftProperty = p0; + rightProperty = p1; + } else { + leftProperty = p1; + rightProperty = p0; + } + + QVERIFY(leftProperty.propertyName() == "anchors.left"); + QCOMPARE(leftProperty.propertyNameParts().count(), 2); + QVERIFY(leftProperty.propertyNameParts().at(0) == "anchors"); + QVERIFY(leftProperty.propertyNameParts().at(1) == "left"); + QCOMPARE(leftProperty.position(), 49); + QCOMPARE(leftProperty.length(), 4); + QVERIFY(leftProperty.value().isBinding()); + QVERIFY(leftProperty.value().toBinding().binding() == "parent.left"); + + QVERIFY(rightProperty.propertyName() == "anchors.right"); + QCOMPARE(rightProperty.propertyNameParts().count(), 2); + QVERIFY(rightProperty.propertyNameParts().at(0) == "anchors"); + QVERIFY(rightProperty.propertyNameParts().at(1) == "right"); + QCOMPARE(rightProperty.position(), 75); + QCOMPARE(rightProperty.length(), 5); + QVERIFY(rightProperty.value().isBinding()); + QVERIFY(rightProperty.value().toBinding().binding() == "parent.right"); + } + +} + +void tst_qdeclarativedom::loadChildObject() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Item { Item {} }"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QVERIFY(rootItem.properties().size() == 1); + + QDeclarativeDomProperty listProperty = rootItem.properties().at(0); + QVERIFY(listProperty.isDefaultProperty()); + QVERIFY(listProperty.value().isList()); + + QDeclarativeDomList list = listProperty.value().toList(); + QVERIFY(list.values().size() == 1); + + QDeclarativeDomObject childItem = list.values().first().toObject(); + QVERIFY(childItem.isValid()); + QVERIFY(childItem.objectType() == "QtQuick/Item"); +} + +void tst_qdeclarativedom::loadComposite() +{ + QFile file(SRCDIR "/data/top.qml"); + QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text)); + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, file.readAll(), QUrl::fromLocalFile(file.fileName()))); + QVERIFY(document.errors().isEmpty()); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QCOMPARE(rootItem.objectType(), QByteArray("MyComponent")); + QCOMPARE(rootItem.properties().size(), 2); + + QDeclarativeDomProperty widthProperty = rootItem.property("width"); + QVERIFY(widthProperty.value().isLiteral()); + + QDeclarativeDomProperty heightProperty = rootItem.property("height"); + QVERIFY(heightProperty.value().isLiteral()); +} + +void tst_qdeclarativedom::testValueSource() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Rectangle { SpringAnimation on height { spring: 1.4; damping: .15; to: Math.min(Math.max(-130, value*2.2 - 130), 133); }}"; + + QDeclarativeEngine freshEngine; + QDeclarativeDomDocument document; + QVERIFY(document.load(&freshEngine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QDeclarativeDomProperty heightProperty = rootItem.properties().at(0); + QVERIFY(heightProperty.propertyName() == "height"); + QVERIFY(heightProperty.value().isValueSource()); + + const QDeclarativeDomValueValueSource valueSource = heightProperty.value().toValueSource(); + QDeclarativeDomObject valueSourceObject = valueSource.object(); + QVERIFY(valueSourceObject.isValid()); + + QVERIFY(valueSourceObject.objectType() == "QtQuick/SpringAnimation"); + + const QDeclarativeDomValue springValue = valueSourceObject.property("spring").value(); + QVERIFY(!springValue.isInvalid()); + QVERIFY(springValue.isLiteral()); + QVERIFY(springValue.toLiteral().literal() == "1.4"); + + const QDeclarativeDomValue sourceValue = valueSourceObject.property("to").value(); + QVERIFY(!sourceValue.isInvalid()); + QVERIFY(sourceValue.isBinding()); + QVERIFY(sourceValue.toBinding().binding() == "Math.min(Math.max(-130, value*2.2 - 130), 133)"); +} + +void tst_qdeclarativedom::testValueInterceptor() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Rectangle { Behavior on height { NumberAnimation { duration: 100 } } }"; + + QDeclarativeEngine freshEngine; + QDeclarativeDomDocument document; + QVERIFY(document.load(&freshEngine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QDeclarativeDomProperty heightProperty = rootItem.properties().at(0); + QVERIFY(heightProperty.propertyName() == "height"); + QVERIFY(heightProperty.value().isValueInterceptor()); + + const QDeclarativeDomValueValueInterceptor valueInterceptor = heightProperty.value().toValueInterceptor(); + QDeclarativeDomObject valueInterceptorObject = valueInterceptor.object(); + QVERIFY(valueInterceptorObject.isValid()); + + QVERIFY(valueInterceptorObject.objectType() == "QtQuick/Behavior"); + + const QDeclarativeDomValue animationValue = valueInterceptorObject.property("animation").value(); + QVERIFY(!animationValue.isInvalid()); + QVERIFY(animationValue.isObject()); +} + +// Test QDeclarativeDomDocument::imports() +void tst_qdeclarativedom::loadImports() +{ + QByteArray qml = "import QtQuick 1.0\n" + "import importlib.sublib 1.1\n" + "import importlib.sublib 1.0 as NewFoo\n" + "import 'import'\n" + "import 'import' as X\n" + "Item {}"; + + QDeclarativeEngine engine; + engine.addImportPath(SRCDIR "/data"); + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml, QUrl::fromLocalFile(SRCDIR "/data/dummy.qml"))); + + QCOMPARE(document.imports().size(), 5); + + QDeclarativeDomImport import = document.imports().at(0); + QCOMPARE(import.type(), QDeclarativeDomImport::Library); + QCOMPARE(import.uri(), QLatin1String("QtQuick")); + QCOMPARE(import.qualifier(), QString()); + QCOMPARE(import.version(), QLatin1String("1.0")); + + import = document.imports().at(1); + QCOMPARE(import.type(), QDeclarativeDomImport::Library); + QCOMPARE(import.uri(), QLatin1String("importlib.sublib")); + QCOMPARE(import.qualifier(), QString()); + QCOMPARE(import.version(), QLatin1String("1.1")); + + import = document.imports().at(2); + QCOMPARE(import.type(), QDeclarativeDomImport::Library); + QCOMPARE(import.uri(), QLatin1String("importlib.sublib")); + QCOMPARE(import.qualifier(), QLatin1String("NewFoo")); + QCOMPARE(import.version(), QLatin1String("1.0")); + + import = document.imports().at(3); + QCOMPARE(import.type(), QDeclarativeDomImport::File); + QCOMPARE(import.uri(), QLatin1String("import")); + QCOMPARE(import.qualifier(), QLatin1String("")); + QCOMPARE(import.version(), QLatin1String("")); + + import = document.imports().at(4); + QCOMPARE(import.type(), QDeclarativeDomImport::File); + QCOMPARE(import.uri(), QLatin1String("import")); + QCOMPARE(import.qualifier(), QLatin1String("X")); + QCOMPARE(import.version(), QLatin1String("")); +} + +// Test loading a file with errors +void tst_qdeclarativedom::loadErrors() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " foo: 12\n" + "}"; + + QDeclarativeDomDocument document; + QVERIFY(false == document.load(&engine, qml)); + + QCOMPARE(document.errors().count(), 1); + QDeclarativeError error = document.errors().first(); + + QCOMPARE(error.url(), QUrl()); + QCOMPARE(error.line(), 3); + QCOMPARE(error.column(), 3); + QCOMPARE(error.description(), QString("Cannot assign to non-existent property \"foo\"")); +} + +// Test loading a file with syntax errors +void tst_qdeclarativedom::loadSyntaxErrors() +{ + QByteArray qml = "import QtQuick 1.0\n" + "asdf"; + + QDeclarativeDomDocument document; + QVERIFY(false == document.load(&engine, qml)); + + QCOMPARE(document.errors().count(), 1); + QDeclarativeError error = document.errors().first(); + + QCOMPARE(error.url(), QUrl()); + QCOMPARE(error.line(), 2); + QCOMPARE(error.column(), 1); + QCOMPARE(error.description(), QString("Syntax error")); +} + +// Test attempting to load a file with remote references +void tst_qdeclarativedom::loadRemoteErrors() +{ + QByteArray qml = "import QtQuick 1.0\n" + "import \"http://localhost/exampleQmlScript.js\" as Script\n" + "Item {\n" + "}"; + QDeclarativeDomDocument document; + QVERIFY(false == document.load(&engine, qml)); + + QCOMPARE(document.errors().count(), 1); + QDeclarativeError error = document.errors().first(); + + QCOMPARE(error.url(), QUrl()); + QCOMPARE(error.line(), -1); + QCOMPARE(error.column(), -1); + QCOMPARE(error.description(), QString("QDeclarativeDomDocument supports local types only")); +} + +// Test dynamic property declarations +void tst_qdeclarativedom::loadDynamicProperty() +{ + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " property int a\n" + " property bool b\n" + " property double c\n" + " property real d\n" + " property string e\n" + " property url f\n" + " property color g\n" + " property date h\n" + " property variant i\n" + " property QtObject j\n" + "}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + + QCOMPARE(rootObject.dynamicProperties().count(), 10); + +#define DP_TEST(index, name, type, test_position, test_length, propTypeName) \ + { \ + QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(index); \ + QVERIFY(d.isValid()); \ + QVERIFY(d.propertyName() == # name ); \ + QVERIFY(d.propertyType() == type); \ + QVERIFY(d.propertyTypeName() == propTypeName); \ + QVERIFY(d.isDefaultProperty() == false); \ + QVERIFY(d.defaultValue().isValid() == false); \ + QCOMPARE(d.position(), test_position); \ + QCOMPARE(d.length(), test_length); \ + } \ + + DP_TEST(0, a, QVariant::Int, 30, 14, "int"); + DP_TEST(1, b, QVariant::Bool, 49, 15, "bool"); + DP_TEST(2, c, QMetaType::QReal, 69, 17, "double"); + DP_TEST(3, d, QMetaType::QReal, 91, 15, "real"); + DP_TEST(4, e, QVariant::String, 111, 17, "string"); + DP_TEST(5, f, QVariant::Url, 133, 14, "url"); + DP_TEST(6, g, QVariant::Color, 152, 16, "color"); + DP_TEST(7, h, QVariant::DateTime, 173, 15, "date"); + DP_TEST(8, i, qMetaTypeId(), 193, 18, "variant"); + DP_TEST(9, j, -1, 216, 19, "QtObject"); + } + + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " id: item\n" + " property int a: 12\n" + " property int b: a + 6\n" + " default property QtObject c\n" + " property alias d: item.a\n" + "}\n"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + + QCOMPARE(rootObject.dynamicProperties().count(), 4); + + { + QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(0); + QVERIFY(d.isDefaultProperty() == false); + QVERIFY(d.isAlias() == false); + QVERIFY(d.defaultValue().isValid()); + QVERIFY(d.defaultValue().propertyName() == "a"); + QVERIFY(d.defaultValue().value().isLiteral()); + } + + { + QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(1); + QVERIFY(d.isDefaultProperty() == false); + QVERIFY(d.isAlias() == false); + QVERIFY(d.defaultValue().isValid()); + QVERIFY(d.defaultValue().propertyName() == "b"); + QVERIFY(d.defaultValue().value().isBinding()); + } + + { + QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(2); + QVERIFY(d.isDefaultProperty() == true); + QVERIFY(d.isAlias() == false); + QVERIFY(d.defaultValue().isValid() == false); + } + + { + QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(3); + QVERIFY(d.isDefaultProperty() == false); + QVERIFY(d.isAlias() == true); + } + } +} + +// Test inline components +void tst_qdeclarativedom::loadComponent() +{ + // Explicit component + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " Component {\n" + " id: myComponent\n" + " Item {}\n" + " }\n" + "}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QVERIFY(rootItem.properties().size() == 1); + + QDeclarativeDomProperty listProperty = rootItem.properties().at(0); + QVERIFY(listProperty.isDefaultProperty()); + QVERIFY(listProperty.value().isList()); + + QDeclarativeDomList list = listProperty.value().toList(); + QVERIFY(list.values().size() == 1); + + QDeclarativeDomObject componentObject = list.values().first().toObject(); + QVERIFY(componentObject.isValid()); + QVERIFY(componentObject.objectClassName() == "Component"); + QVERIFY(componentObject.isComponent()); + + QDeclarativeDomComponent component = componentObject.toComponent(); + QVERIFY(component.isValid()); + QVERIFY(component.objectType() == "QtQuick/Component"); + QVERIFY(component.objectTypeMajorVersion() == 1); + QVERIFY(component.objectTypeMinorVersion() == 0); + QVERIFY(component.objectClassName() == "Component"); + QVERIFY(component.objectId() == "myComponent"); + QVERIFY(component.properties().isEmpty()); + QVERIFY(component.dynamicProperties().isEmpty()); + QVERIFY(component.isCustomType() == false); + QVERIFY(component.customTypeData() == ""); + QVERIFY(component.isComponent()); + QCOMPARE(component.position(), 30); + QCOMPARE(component.length(), 57); + + QVERIFY(component.componentRoot().isValid()); + QVERIFY(component.componentRoot().objectClassName() == "Item"); + } + + // Implicit component + { + QByteArray qml = "import QtQuick 1.0\n" + "ListView {\n" + " delegate: Item {}\n" + "}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QVERIFY(rootItem.properties().size() == 1); + + QDeclarativeDomProperty delegate = rootItem.property("delegate"); + + QDeclarativeDomObject componentObject = delegate.value().toObject(); + QVERIFY(componentObject.isValid()); + QVERIFY(componentObject.objectClassName() == "Component"); + QVERIFY(componentObject.isComponent()); + + QDeclarativeDomComponent component = componentObject.toComponent(); + QVERIFY(component.isValid()); + QVERIFY(component.objectType() == "QtQuick/Component"); + QVERIFY(component.objectClassName() == "Component"); + QVERIFY(component.objectId() == ""); + QVERIFY(component.properties().isEmpty()); + QVERIFY(component.dynamicProperties().isEmpty()); + QVERIFY(component.isCustomType() == false); + QVERIFY(component.customTypeData() == ""); + QVERIFY(component.isComponent()); + QCOMPARE(component.position(), 44); + QCOMPARE(component.length(), 7); + + QVERIFY(component.componentRoot().isValid()); + QVERIFY(component.componentRoot().objectClassName() == "Item"); + } +} + +// Test QDeclarativeDomObject::dynamicProperty() method +void tst_qdeclarativedom::object_dynamicProperty() +{ + // Invalid object + { + QDeclarativeDomObject object; + QVERIFY(object.dynamicProperty("").isValid() == false); + QVERIFY(object.dynamicProperty("foo").isValid() == false); + } + + + // Valid object, no dynamic properties + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + + QVERIFY(rootObject.dynamicProperty("").isValid() == false); + QVERIFY(rootObject.dynamicProperty("foo").isValid() == false); + } + + // Valid object, dynamic properties + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " property int a\n" + "}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + + QVERIFY(rootObject.dynamicProperty("").isValid() == false); + QVERIFY(rootObject.dynamicProperty("foo").isValid() == false); + + QDeclarativeDomDynamicProperty p = rootObject.dynamicProperty("a"); + QVERIFY(p.isValid()); + QVERIFY(p.propertyName() == "a"); + QVERIFY(p.propertyType() == QVariant::Int); + QVERIFY(p.propertyTypeName() == "int"); + QVERIFY(p.isDefaultProperty() == false); + QCOMPARE(p.position(), 30); + QCOMPARE(p.length(), 14); + } + +} + +// Test QDeclarativeObject::property() method +void tst_qdeclarativedom::object_property() +{ + // Invalid object + { + QDeclarativeDomObject object; + QVERIFY(object.property("").isValid() == false); + QVERIFY(object.property("foo").isValid() == false); + } + + // Valid object - no default + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " x: 10\n" + " y: 12\n" + "}\n"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + + QVERIFY(rootObject.property("").isValid() == false); + QVERIFY(rootObject.property("foo").isValid() == false); + + QDeclarativeDomProperty x = rootObject.property("x"); + QVERIFY(x.isValid()); + QVERIFY(x.propertyName() == "x"); + QVERIFY(x.propertyNameParts().count() == 1); + QVERIFY(x.propertyNameParts().at(0) == "x"); + QVERIFY(x.isDefaultProperty() == false); + QVERIFY(x.value().isLiteral()); + QVERIFY(x.value().toLiteral().literal() == "10"); + QCOMPARE(x.position(), 30); + QCOMPARE(x.length(), 1); + + QDeclarativeDomProperty y = rootObject.property("y"); + QVERIFY(y.isValid()); + QVERIFY(y.propertyName() == "y"); + QVERIFY(y.propertyNameParts().count() == 1); + QVERIFY(y.propertyNameParts().at(0) == "y"); + QVERIFY(y.isDefaultProperty() == false); + QVERIFY(y.value().isLiteral()); + QVERIFY(y.value().toLiteral().literal() == "12"); + QCOMPARE(y.position(), 40); + QCOMPARE(y.length(), 1); + } + + // Valid object - with default + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " x: 10\n" + " y: 12\n" + " Item {}\n" + "}\n"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + + QVERIFY(rootObject.property("").isValid() == false); + QVERIFY(rootObject.property("foo").isValid() == false); + + QDeclarativeDomProperty x = rootObject.property("x"); + QVERIFY(x.isValid()); + QVERIFY(x.propertyName() == "x"); + QVERIFY(x.propertyNameParts().count() == 1); + QVERIFY(x.propertyNameParts().at(0) == "x"); + QVERIFY(x.isDefaultProperty() == false); + QVERIFY(x.value().isLiteral()); + QVERIFY(x.value().toLiteral().literal() == "10"); + QCOMPARE(x.position(), 30); + QCOMPARE(x.length(), 1); + + QDeclarativeDomProperty y = rootObject.property("y"); + QVERIFY(y.isValid()); + QVERIFY(y.propertyName() == "y"); + QVERIFY(y.propertyNameParts().count() == 1); + QVERIFY(y.propertyNameParts().at(0) == "y"); + QVERIFY(y.isDefaultProperty() == false); + QVERIFY(y.value().isLiteral()); + QVERIFY(y.value().toLiteral().literal() == "12"); + QCOMPARE(y.position(), 40); + QCOMPARE(y.length(), 1); + + QDeclarativeDomProperty data = rootObject.property("data"); + QVERIFY(data.isValid()); + QVERIFY(data.propertyName() == "data"); + QVERIFY(data.propertyNameParts().count() == 1); + QVERIFY(data.propertyNameParts().at(0) == "data"); + QVERIFY(data.isDefaultProperty() == true); + QVERIFY(data.value().isList()); + QCOMPARE(data.position(), 50); + QCOMPARE(data.length(), 0); + } +} + +// Tests the QDeclarativeDomObject::url() method +void tst_qdeclarativedom::object_url() +{ + // Invalid object + { + QDeclarativeDomObject object; + QCOMPARE(object.url(), QUrl()); + } + + // Valid builtin object + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + QCOMPARE(rootObject.url(), QUrl()); + } + + // Valid composite object + { + QByteArray qml = "import QtQuick 1.0\n" + "MyItem {}"; + + QUrl myUrl = QUrl::fromLocalFile(SRCDIR "/data/main.qml"); + QUrl subUrl = QUrl::fromLocalFile(SRCDIR "/data/MyItem.qml"); + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml, myUrl)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + QCOMPARE(rootObject.url(), subUrl); + } +} + +// Test copy constructors and operators +void tst_qdeclarativedom::copy() +{ + QByteArray qml = "import QtQuick 1.0\n" + "MyItem {\n" + " id: myItem\n" + " property int a: 10\n" + " x: 10\n" + " y: x + 10\n" + " NumberAnimation on z {}\n" + " Behavior on opacity {}\n" + " Component {\n" + " Item{}\n" + " }\n" + " children: [ Item{}, Item{} ]\n" + "}\n"; + + QUrl myUrl = QUrl::fromLocalFile(SRCDIR "/data/main.qml"); + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml, myUrl)); + + // QDeclarativeDomDocument + { + QDeclarativeDomDocument document2(document); + QDeclarativeDomDocument document3; + document3 = document; + + QCOMPARE(document.imports().count(), document2.imports().count()); + QCOMPARE(document.errors().count(), document2.errors().count()); + QCOMPARE(document.rootObject().objectClassName(), document2.rootObject().objectClassName()); + + QCOMPARE(document.imports().count(), document3.imports().count()); + QCOMPARE(document.errors().count(), document3.errors().count()); + QCOMPARE(document.rootObject().objectClassName(), document3.rootObject().objectClassName()); + } + + // QDeclarativeDomImport + { + QCOMPARE(document.imports().count(), 1); + QDeclarativeDomImport import = document.imports().at(0); + + QDeclarativeDomImport import2(import); + QDeclarativeDomImport import3; + import3 = import2; + + QCOMPARE(import.type(), import2.type()); + QCOMPARE(import.uri(), import2.uri()); + QCOMPARE(import.version(), import2.version()); + QCOMPARE(import.qualifier(), import2.qualifier()); + + QCOMPARE(import.type(), import3.type()); + QCOMPARE(import.uri(), import3.uri()); + QCOMPARE(import.version(), import3.version()); + QCOMPARE(import.qualifier(), import3.qualifier()); + } + + // QDeclarativeDomObject + { + QDeclarativeDomObject object = document.rootObject(); + QVERIFY(object.isValid()); + + QDeclarativeDomObject object2(object); + QDeclarativeDomObject object3; + object3 = object; + + QCOMPARE(object.isValid(), object2.isValid()); + QCOMPARE(object.objectType(), object2.objectType()); + QCOMPARE(object.objectClassName(), object2.objectClassName()); + QCOMPARE(object.objectTypeMajorVersion(), object2.objectTypeMajorVersion()); + QCOMPARE(object.objectTypeMinorVersion(), object2.objectTypeMinorVersion()); + QCOMPARE(object.objectId(), object2.objectId()); + QCOMPARE(object.properties().count(), object2.properties().count()); + QCOMPARE(object.dynamicProperties().count(), object2.dynamicProperties().count()); + QCOMPARE(object.isCustomType(), object2.isCustomType()); + QCOMPARE(object.customTypeData(), object2.customTypeData()); + QCOMPARE(object.isComponent(), object2.isComponent()); + QCOMPARE(object.position(), object2.position()); + QCOMPARE(object.length(), object2.length()); + QCOMPARE(object.url(), object2.url()); + + QCOMPARE(object.isValid(), object3.isValid()); + QCOMPARE(object.objectType(), object3.objectType()); + QCOMPARE(object.objectClassName(), object3.objectClassName()); + QCOMPARE(object.objectTypeMajorVersion(), object3.objectTypeMajorVersion()); + QCOMPARE(object.objectTypeMinorVersion(), object3.objectTypeMinorVersion()); + QCOMPARE(object.objectId(), object3.objectId()); + QCOMPARE(object.properties().count(), object3.properties().count()); + QCOMPARE(object.dynamicProperties().count(), object3.dynamicProperties().count()); + QCOMPARE(object.isCustomType(), object3.isCustomType()); + QCOMPARE(object.customTypeData(), object3.customTypeData()); + QCOMPARE(object.isComponent(), object3.isComponent()); + QCOMPARE(object.position(), object3.position()); + QCOMPARE(object.length(), object3.length()); + QCOMPARE(object.url(), object3.url()); + } + + // QDeclarativeDomDynamicProperty + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomDynamicProperty property = object.dynamicProperty("a"); + + QDeclarativeDomDynamicProperty property2(property); + QDeclarativeDomDynamicProperty property3; + property3 = property; + + QCOMPARE(property.isValid(), property2.isValid()); + QCOMPARE(property.propertyName(), property2.propertyName()); + QCOMPARE(property.propertyType(), property2.propertyType()); + QCOMPARE(property.propertyTypeName(), property2.propertyTypeName()); + QCOMPARE(property.isDefaultProperty(), property2.isDefaultProperty()); + QCOMPARE(property.defaultValue().propertyName(), property2.defaultValue().propertyName()); + QCOMPARE(property.position(), property2.position()); + QCOMPARE(property.length(), property2.length()); + + QCOMPARE(property.isValid(), property3.isValid()); + QCOMPARE(property.propertyName(), property3.propertyName()); + QCOMPARE(property.propertyType(), property3.propertyType()); + QCOMPARE(property.propertyTypeName(), property3.propertyTypeName()); + QCOMPARE(property.isDefaultProperty(), property3.isDefaultProperty()); + QCOMPARE(property.defaultValue().propertyName(), property3.defaultValue().propertyName()); + QCOMPARE(property.position(), property3.position()); + QCOMPARE(property.length(), property3.length()); + } + + // QDeclarativeDomProperty + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("opacity"); + + QDeclarativeDomProperty property2(property); + QDeclarativeDomProperty property3; + property3 = property; + + QCOMPARE(property.isValid(), property2.isValid()); + QCOMPARE(property.propertyName(), property2.propertyName()); + QCOMPARE(property.propertyNameParts(), property2.propertyNameParts()); + QCOMPARE(property.isDefaultProperty(), property2.isDefaultProperty()); + QCOMPARE(property.value().type(), property2.value().type()); + QCOMPARE(property.position(), property2.position()); + QCOMPARE(property.length(), property2.length()); + + QCOMPARE(property.isValid(), property3.isValid()); + QCOMPARE(property.propertyName(), property3.propertyName()); + QCOMPARE(property.propertyNameParts(), property3.propertyNameParts()); + QCOMPARE(property.isDefaultProperty(), property3.isDefaultProperty()); + QCOMPARE(property.value().type(), property3.value().type()); + QCOMPARE(property.position(), property3.position()); + QCOMPARE(property.length(), property3.length()); + } + + // QDeclarativeDomValueLiteral + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("x"); + QDeclarativeDomValueLiteral literal = property.value().toLiteral(); + QCOMPARE(literal.literal(), QString("10")); + + QDeclarativeDomValueLiteral literal2(literal); + QDeclarativeDomValueLiteral literal3; + literal3 = literal2; + + QCOMPARE(literal2.literal(), QString("10")); + QCOMPARE(literal3.literal(), QString("10")); + } + + + // QDeclarativeDomValueBinding + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("y"); + QDeclarativeDomValueBinding binding = property.value().toBinding(); + QCOMPARE(binding.binding(), QString("x + 10")); + + QDeclarativeDomValueBinding binding2(binding); + QDeclarativeDomValueBinding binding3; + binding3 = binding2; + + QCOMPARE(binding2.binding(), QString("x + 10")); + QCOMPARE(binding3.binding(), QString("x + 10")); + } + + // QDeclarativeDomValueValueSource + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("z"); + QDeclarativeDomValueValueSource source = property.value().toValueSource(); + QCOMPARE(source.object().objectClassName(), QByteArray("NumberAnimation")); + + QDeclarativeDomValueValueSource source2(source); + QDeclarativeDomValueValueSource source3; + source3 = source; + + QCOMPARE(source2.object().objectClassName(), QByteArray("NumberAnimation")); + QCOMPARE(source3.object().objectClassName(), QByteArray("NumberAnimation")); + } + + // QDeclarativeDomValueValueInterceptor + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("opacity"); + QDeclarativeDomValueValueInterceptor interceptor = property.value().toValueInterceptor(); + QCOMPARE(interceptor.object().objectClassName(), QByteArray("Behavior")); + + QDeclarativeDomValueValueInterceptor interceptor2(interceptor); + QDeclarativeDomValueValueInterceptor interceptor3; + interceptor3 = interceptor; + + QCOMPARE(interceptor2.object().objectClassName(), QByteArray("Behavior")); + QCOMPARE(interceptor3.object().objectClassName(), QByteArray("Behavior")); + } + + // QDeclarativeDomComponent + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("data"); + QCOMPARE(property.value().toList().values().count(), 1); + QDeclarativeDomComponent component = + property.value().toList().values().at(0).toObject().toComponent(); + QCOMPARE(component.componentRoot().objectClassName(), QByteArray("Item")); + + QDeclarativeDomComponent component2(component); + QDeclarativeDomComponent component3; + component3 = component; + + QCOMPARE(component.componentRoot().objectClassName(), component2.componentRoot().objectClassName()); + QCOMPARE(component.isValid(), component2.isValid()); + QCOMPARE(component.objectType(), component2.objectType()); + QCOMPARE(component.objectClassName(), component2.objectClassName()); + QCOMPARE(component.objectTypeMajorVersion(), component2.objectTypeMajorVersion()); + QCOMPARE(component.objectTypeMinorVersion(), component2.objectTypeMinorVersion()); + QCOMPARE(component.objectId(), component2.objectId()); + QCOMPARE(component.properties().count(), component2.properties().count()); + QCOMPARE(component.dynamicProperties().count(), component2.dynamicProperties().count()); + QCOMPARE(component.isCustomType(), component2.isCustomType()); + QCOMPARE(component.customTypeData(), component2.customTypeData()); + QCOMPARE(component.isComponent(), component2.isComponent()); + QCOMPARE(component.position(), component2.position()); + QCOMPARE(component.length(), component2.length()); + QCOMPARE(component.url(), component2.url()); + + QCOMPARE(component.componentRoot().objectClassName(), component3.componentRoot().objectClassName()); + QCOMPARE(component.isValid(), component3.isValid()); + QCOMPARE(component.objectType(), component3.objectType()); + QCOMPARE(component.objectClassName(), component3.objectClassName()); + QCOMPARE(component.objectTypeMajorVersion(), component3.objectTypeMajorVersion()); + QCOMPARE(component.objectTypeMinorVersion(), component3.objectTypeMinorVersion()); + QCOMPARE(component.objectId(), component3.objectId()); + QCOMPARE(component.properties().count(), component3.properties().count()); + QCOMPARE(component.dynamicProperties().count(), component3.dynamicProperties().count()); + QCOMPARE(component.isCustomType(), component3.isCustomType()); + QCOMPARE(component.customTypeData(), component3.customTypeData()); + QCOMPARE(component.isComponent(), component3.isComponent()); + QCOMPARE(component.position(), component3.position()); + QCOMPARE(component.length(), component3.length()); + QCOMPARE(component.url(), component3.url()); + } + + // QDeclarativeDomValue + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("data"); + QDeclarativeDomValue value = property.value(); + + QDeclarativeDomValue value2(value); + QDeclarativeDomValue value3; + value3 = value; + + QCOMPARE(value.type(), value2.type()); + QCOMPARE(value.isInvalid(), value2.isInvalid()); + QCOMPARE(value.isLiteral(), value2.isLiteral()); + QCOMPARE(value.isBinding(), value2.isBinding()); + QCOMPARE(value.isValueSource(), value2.isValueSource()); + QCOMPARE(value.isValueInterceptor(), value2.isValueInterceptor()); + QCOMPARE(value.isObject(), value2.isObject()); + QCOMPARE(value.isList(), value2.isList()); + QCOMPARE(value.position(), value2.position()); + QCOMPARE(value.length(), value2.length()); + + QCOMPARE(value.type(), value3.type()); + QCOMPARE(value.isInvalid(), value3.isInvalid()); + QCOMPARE(value.isLiteral(), value3.isLiteral()); + QCOMPARE(value.isBinding(), value3.isBinding()); + QCOMPARE(value.isValueSource(), value3.isValueSource()); + QCOMPARE(value.isValueInterceptor(), value3.isValueInterceptor()); + QCOMPARE(value.isObject(), value3.isObject()); + QCOMPARE(value.isList(), value3.isList()); + QCOMPARE(value.position(), value3.position()); + QCOMPARE(value.length(), value3.length()); + } + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("x"); + QDeclarativeDomValue value = property.value(); + + QDeclarativeDomValue value2(value); + QDeclarativeDomValue value3; + value3 = value; + + QCOMPARE(value.type(), value2.type()); + QCOMPARE(value.isInvalid(), value2.isInvalid()); + QCOMPARE(value.isLiteral(), value2.isLiteral()); + QCOMPARE(value.isBinding(), value2.isBinding()); + QCOMPARE(value.isValueSource(), value2.isValueSource()); + QCOMPARE(value.isValueInterceptor(), value2.isValueInterceptor()); + QCOMPARE(value.isObject(), value2.isObject()); + QCOMPARE(value.isList(), value2.isList()); + QCOMPARE(value.position(), value2.position()); + QCOMPARE(value.length(), value2.length()); + + QCOMPARE(value.type(), value3.type()); + QCOMPARE(value.isInvalid(), value3.isInvalid()); + QCOMPARE(value.isLiteral(), value3.isLiteral()); + QCOMPARE(value.isBinding(), value3.isBinding()); + QCOMPARE(value.isValueSource(), value3.isValueSource()); + QCOMPARE(value.isValueInterceptor(), value3.isValueInterceptor()); + QCOMPARE(value.isObject(), value3.isObject()); + QCOMPARE(value.isList(), value3.isList()); + QCOMPARE(value.position(), value3.position()); + QCOMPARE(value.length(), value3.length()); + } + { + QDeclarativeDomValue value; + + QDeclarativeDomValue value2(value); + QDeclarativeDomValue value3; + value3 = value; + + QCOMPARE(value.type(), value2.type()); + QCOMPARE(value.isInvalid(), value2.isInvalid()); + QCOMPARE(value.isLiteral(), value2.isLiteral()); + QCOMPARE(value.isBinding(), value2.isBinding()); + QCOMPARE(value.isValueSource(), value2.isValueSource()); + QCOMPARE(value.isValueInterceptor(), value2.isValueInterceptor()); + QCOMPARE(value.isObject(), value2.isObject()); + QCOMPARE(value.isList(), value2.isList()); + QCOMPARE(value.position(), value2.position()); + QCOMPARE(value.length(), value2.length()); + + QCOMPARE(value.type(), value3.type()); + QCOMPARE(value.isInvalid(), value3.isInvalid()); + QCOMPARE(value.isLiteral(), value3.isLiteral()); + QCOMPARE(value.isBinding(), value3.isBinding()); + QCOMPARE(value.isValueSource(), value3.isValueSource()); + QCOMPARE(value.isValueInterceptor(), value3.isValueInterceptor()); + QCOMPARE(value.isObject(), value3.isObject()); + QCOMPARE(value.isList(), value3.isList()); + QCOMPARE(value.position(), value3.position()); + QCOMPARE(value.length(), value3.length()); + } + + // QDeclarativeDomList + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("children"); + QDeclarativeDomList list = property.value().toList(); + QCOMPARE(list.values().count(), 2); + + QDeclarativeDomList list2(list); + QDeclarativeDomList list3; + list3 = list2; + + QCOMPARE(list.values().count(), list2.values().count()); + QCOMPARE(list.position(), list2.position()); + QCOMPARE(list.length(), list2.length()); + QCOMPARE(list.commaPositions(), list2.commaPositions()); + + QCOMPARE(list.values().count(), list3.values().count()); + QCOMPARE(list.position(), list3.position()); + QCOMPARE(list.length(), list3.length()); + QCOMPARE(list.commaPositions(), list3.commaPositions()); + + } +} + +// Tests the position/length of various elements +void tst_qdeclarativedom::position() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " id: myItem\n" + " property int a: 10\n" + " x: 10\n" + " y: x + 10\n" + " NumberAnimation on z {}\n" + " Behavior on opacity {}\n" + " Component {\n" + " Item{}\n" + " }\n" + " children: [ Item{}, Item{} ]\n" + "}\n"; + + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject root = document.rootObject(); + + // All QDeclarativeDomDynamicProperty + QDeclarativeDomDynamicProperty dynProp = root.dynamicProperty("a"); + QCOMPARE(dynProp.position(), 45); + QCOMPARE(dynProp.length(), 18); + + // All QDeclarativeDomProperty + QDeclarativeDomProperty x = root.property("x"); + QCOMPARE(x.position(), 68); + QCOMPARE(x.length(), 1); + + QDeclarativeDomProperty y = root.property("y"); + QCOMPARE(y.position(), 78); + QCOMPARE(y.length(), 1); + + QDeclarativeDomProperty z = root.property("z"); + QCOMPARE(z.position(), 111); + QCOMPARE(z.length(), 1); + + QDeclarativeDomProperty opacity = root.property("opacity"); + QCOMPARE(opacity.position(), 132); + QCOMPARE(opacity.length(), 7); + + QDeclarativeDomProperty data = root.property("data"); + QCOMPARE(data.position(), 147); + QCOMPARE(data.length(), 0); + + QDeclarativeDomProperty children = root.property("children"); + QCOMPARE(children.position(), 184); + QCOMPARE(children.length(), 8); + + QDeclarativeDomList dataList = data.value().toList(); + QCOMPARE(dataList.values().count(), 1); + QDeclarativeDomList childrenList = children.value().toList(); + QCOMPARE(childrenList.values().count(), 2); + + // All QDeclarativeDomObject + QCOMPARE(root.position(), 19); + QCOMPARE(root.length(), 195); + + QDeclarativeDomObject numberAnimation = z.value().toValueSource().object(); + QCOMPARE(numberAnimation.position(), 92); + QCOMPARE(numberAnimation.length(), 23); + + QDeclarativeDomObject behavior = opacity.value().toValueInterceptor().object(); + QCOMPARE(behavior.position(), 120); + QCOMPARE(behavior.length(), 22); + + QDeclarativeDomObject component = dataList.values().at(0).toObject(); + QCOMPARE(component.position(), 147); + QCOMPARE(component.length(), 32); + + QDeclarativeDomObject componentRoot = component.toComponent().componentRoot(); + QCOMPARE(componentRoot.position(), 167); + QCOMPARE(componentRoot.length(), 6); + + QDeclarativeDomObject child1 = childrenList.values().at(0).toObject(); + QCOMPARE(child1.position(), 196); + QCOMPARE(child1.length(), 6); + + QDeclarativeDomObject child2 = childrenList.values().at(1).toObject(); + QCOMPARE(child2.position(), 204); + QCOMPARE(child2.length(), 6); + + // All QDeclarativeDomValue + QDeclarativeDomValue xValue = x.value(); + QCOMPARE(xValue.position(), 71); + QCOMPARE(xValue.length(), 2); + + QDeclarativeDomValue yValue = y.value(); + QCOMPARE(yValue.position(), 81); + QCOMPARE(yValue.length(), 6); + + QDeclarativeDomValue zValue = z.value(); + QCOMPARE(zValue.position(), 92); + QCOMPARE(zValue.length(), 23); + + QDeclarativeDomValue opacityValue = opacity.value(); + QCOMPARE(opacityValue.position(), 120); + QCOMPARE(opacityValue.length(), 22); + + QDeclarativeDomValue dataValue = data.value(); + QCOMPARE(dataValue.position(), 147); + QCOMPARE(dataValue.length(), 32); + + QDeclarativeDomValue child1Value = childrenList.values().at(0); + QCOMPARE(child1Value.position(), 196); + QCOMPARE(child1Value.length(), 6); + + QDeclarativeDomValue child2Value = childrenList.values().at(1); + QCOMPARE(child2Value.position(), 204); + QCOMPARE(child2Value.length(), 6); + + // All QDeclarativeDomList + QCOMPARE(childrenList.position(), 194); + QCOMPARE(childrenList.length(), 18); +} + +QTEST_MAIN(tst_qdeclarativedom) + +#include "tst_qdeclarativedom.moc" -- cgit v1.2.3