diff options
author | Kent Hansen <kent.hansen@nokia.com> | 2011-10-14 10:51:42 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-10-21 11:53:26 +0200 |
commit | bfb3c424abc7c839dc44de0e36024ede99ece736 (patch) | |
tree | b6814d0238bead8518b23c078beb818432de6ce4 /tests/auto/declarative/qquickloader | |
parent | 2d119a137f1bc0c8b1113cd6c58413a1b89a4c1c (diff) |
Rename Qt Quick-specific classes to QQuick*
The QSG (SceneGraph) prefix is too generic for
Qt Quick(2)-specific classes.
All the classes and files in the declarative/items
directory have been renamed.
In particular, for classes that are currently public,
the renaming is as follows:
QSGView --> QQuickView
QSGCanvas --> QQuickCanvas
QSGItem --> QQuickItem
QSGPaintedItem --> QQuickPaintedItem
The header files have been renamed accordingly
(e.g. qsgview.h --> qquickview.h).
Change-Id: Iac937fff81db20bb639486a793c3aeb5230b038c
Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
Diffstat (limited to 'tests/auto/declarative/qquickloader')
53 files changed, 6660 insertions, 0 deletions
diff --git a/tests/auto/declarative/qquickloader/data/ActiveComponent.qml b/tests/auto/declarative/qquickloader/data/ActiveComponent.qml new file mode 100644 index 0000000000..24c6f7ad91 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/ActiveComponent.qml @@ -0,0 +1,11 @@ +import QtQuick 2.0 + +Item { + id: behaviorCounter + property int behaviorCount: 0 + property int canary: 0 + + Behavior on canary { + NumberAnimation { target: behaviorCounter; property: "behaviorCount"; to: (behaviorCounter.behaviorCount + 1); duration: 0 } + } +} diff --git a/tests/auto/declarative/qquickloader/data/AnchoredLoader.qml b/tests/auto/declarative/qquickloader/data/AnchoredLoader.qml new file mode 100644 index 0000000000..1a2a620d7f --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/AnchoredLoader.qml @@ -0,0 +1,14 @@ +import QtQuick 2.0 + +Rectangle { + width: 300 + height: 200 + color: "blue" + Loader { + objectName: "loader" + anchors.fill: parent + sourceComponent: Component { + Rectangle { color: "red"; objectName: "sourceElement" } + } + } +} diff --git a/tests/auto/declarative/qquickloader/data/BigComponent.qml b/tests/auto/declarative/qquickloader/data/BigComponent.qml new file mode 100644 index 0000000000..df92532c43 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/BigComponent.qml @@ -0,0 +1,5015 @@ +import QtQuick 2.0 + +Item { + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} + Item {} +} diff --git a/tests/auto/declarative/qquickloader/data/BlueRect.qml b/tests/auto/declarative/qquickloader/data/BlueRect.qml new file mode 100644 index 0000000000..e96ac00f21 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/BlueRect.qml @@ -0,0 +1,8 @@ +import QtQuick 2.0 + +Rectangle { + objectName: "blue" + width: 100 + height: 100 + color: "blue" +} diff --git a/tests/auto/declarative/qquickloader/data/CreationContextLoader.qml b/tests/auto/declarative/qquickloader/data/CreationContextLoader.qml new file mode 100644 index 0000000000..4dd73e797c --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/CreationContextLoader.qml @@ -0,0 +1,15 @@ +import QtQuick 2.0 + +Loader { + id: myLoader + property int testProperty: 1912 + sourceComponent: loaderComponent + Component { + id: loaderComponent + Item { + Component.onCompleted: { + test = (myLoader.testProperty == 1912); + } + } + } +} diff --git a/tests/auto/declarative/qquickloader/data/GraphicsWidget250x250.qml b/tests/auto/declarative/qquickloader/data/GraphicsWidget250x250.qml new file mode 100644 index 0000000000..dae8e3fbbb --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/GraphicsWidget250x250.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 + +QGraphicsWidget { + size: "250x250" +} diff --git a/tests/auto/declarative/qquickloader/data/GreenRect.qml b/tests/auto/declarative/qquickloader/data/GreenRect.qml new file mode 100644 index 0000000000..99cefaf176 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/GreenRect.qml @@ -0,0 +1,7 @@ +import QtQuick 2.0 + +Rectangle { + width: 100; height: 100 + color: "green" + Component.onCompleted: myLoader.source = "BlueRect.qml" +} diff --git a/tests/auto/declarative/qquickloader/data/InitialPropertyValuesComponent.qml b/tests/auto/declarative/qquickloader/data/InitialPropertyValuesComponent.qml new file mode 100644 index 0000000000..24c6f7ad91 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/InitialPropertyValuesComponent.qml @@ -0,0 +1,11 @@ +import QtQuick 2.0 + +Item { + id: behaviorCounter + property int behaviorCount: 0 + property int canary: 0 + + Behavior on canary { + NumberAnimation { target: behaviorCounter; property: "behaviorCount"; to: (behaviorCounter.behaviorCount + 1); duration: 0 } + } +} diff --git a/tests/auto/declarative/qquickloader/data/InvalidSourceComponent.qml b/tests/auto/declarative/qquickloader/data/InvalidSourceComponent.qml new file mode 100644 index 0000000000..7efa4a5f61 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/InvalidSourceComponent.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 + +Item { + RandomError +} diff --git a/tests/auto/declarative/qquickloader/data/NoResize.qml b/tests/auto/declarative/qquickloader/data/NoResize.qml new file mode 100644 index 0000000000..9b3ea6410b --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/NoResize.qml @@ -0,0 +1,8 @@ +import QtQuick 2.0 + +Item { + width: 200; height: 80 + Loader { + source: "Rect120x60.qml" + } +} diff --git a/tests/auto/declarative/qquickloader/data/NoResizeGraphicsWidget.qml b/tests/auto/declarative/qquickloader/data/NoResizeGraphicsWidget.qml new file mode 100644 index 0000000000..c0f51d8c35 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/NoResizeGraphicsWidget.qml @@ -0,0 +1,9 @@ +import QtQuick 2.0 + +Item { + width: 200 + height: 80 + Loader { + source: "GraphicsWidget250x250.qml" + } +} diff --git a/tests/auto/declarative/qquickloader/data/QTBUG_16928.qml b/tests/auto/declarative/qquickloader/data/QTBUG_16928.qml new file mode 100644 index 0000000000..903d7f0812 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/QTBUG_16928.qml @@ -0,0 +1,23 @@ +import QtQuick 2.0 + +Rectangle { + color: "green" + width: loader.implicitWidth+50 + height: loader.implicitHeight+50 + + Loader { + id: loader + sourceComponent: Item { + anchors.centerIn: parent + + implicitWidth: 200 + implicitHeight: 200 + Rectangle { + color: "red" + anchors.fill: parent + } + } + anchors.fill: parent + anchors.margins: 15 + } +} diff --git a/tests/auto/declarative/qquickloader/data/QTBUG_17114.qml b/tests/auto/declarative/qquickloader/data/QTBUG_17114.qml new file mode 100644 index 0000000000..7402037553 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/QTBUG_17114.qml @@ -0,0 +1,18 @@ +import QtQuick 2.0 + +Rectangle { + property real loaderWidth: loader.width + property real loaderHeight: loader.height + width: 200 + height: 200 + + Loader { + id: loader + sourceComponent: Item { + property real iwidth: 32 + property real iheight: 32 + width: iwidth + height: iheight + } + } +} diff --git a/tests/auto/declarative/qquickloader/data/Rect120x60.qml b/tests/auto/declarative/qquickloader/data/Rect120x60.qml new file mode 100644 index 0000000000..fc9e447e69 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/Rect120x60.qml @@ -0,0 +1,6 @@ +import QtQuick 2.0 + +Rectangle { + width: 120 + height:60 +} diff --git a/tests/auto/declarative/qquickloader/data/SetSourceComponent.qml b/tests/auto/declarative/qquickloader/data/SetSourceComponent.qml new file mode 100644 index 0000000000..83cc358f7d --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/SetSourceComponent.qml @@ -0,0 +1,9 @@ +import QtQuick 2.0 + +Item { + function clear() { + loader.sourceComponent = undefined + } + Component { id: comp; Rectangle { width: 100; height: 50 } } + Loader { id: loader; sourceComponent: comp } +} diff --git a/tests/auto/declarative/qquickloader/data/SizeGraphicsWidgetToLoader.qml b/tests/auto/declarative/qquickloader/data/SizeGraphicsWidgetToLoader.qml new file mode 100644 index 0000000000..2a63b4d34f --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/SizeGraphicsWidgetToLoader.qml @@ -0,0 +1,7 @@ +import QtQuick 2.0 + +Loader { + width: 200 + height: 80 + source: "GraphicsWidget250x250.qml" +} diff --git a/tests/auto/declarative/qquickloader/data/SizeLoaderToGraphicsWidget.qml b/tests/auto/declarative/qquickloader/data/SizeLoaderToGraphicsWidget.qml new file mode 100644 index 0000000000..a9875d8e21 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/SizeLoaderToGraphicsWidget.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 + +Loader { + source: "GraphicsWidget250x250.qml" +} diff --git a/tests/auto/declarative/qquickloader/data/SizeToItem.qml b/tests/auto/declarative/qquickloader/data/SizeToItem.qml new file mode 100644 index 0000000000..866365754f --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/SizeToItem.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 + +Loader { + source: "Rect120x60.qml" +} diff --git a/tests/auto/declarative/qquickloader/data/SizeToLoader.qml b/tests/auto/declarative/qquickloader/data/SizeToLoader.qml new file mode 100644 index 0000000000..dad18c6939 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/SizeToLoader.qml @@ -0,0 +1,6 @@ +import QtQuick 2.0 + +Loader { + width: 200; height: 80 + source: "Rect120x60.qml" +} diff --git a/tests/auto/declarative/qquickloader/data/VmeError.qml b/tests/auto/declarative/qquickloader/data/VmeError.qml new file mode 100644 index 0000000000..0443aa9054 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/VmeError.qml @@ -0,0 +1,7 @@ +import QtQuick 2.0 + +Rectangle { + width: 100; height: 100; color: "red" + signal somethingHappened + onSomethingHappened: QtObject {} +} diff --git a/tests/auto/declarative/qquickloader/data/active.1.qml b/tests/auto/declarative/qquickloader/data/active.1.qml new file mode 100644 index 0000000000..2dbd1a0887 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/active.1.qml @@ -0,0 +1,31 @@ +import QtQuick 2.0 + +Item { + id: root + + Loader { + id: loader + objectName: "loader" + active: false + } + + Component { + id: inlineTestComponent + Item { + id: inlineTestItem + property int someProperty: 5 + } + } + + function doSetSource() { + loader.source = "ActiveComponent.qml"; + } + + function doSetSourceComponent() { + loader.sourceComponent = inlineTestComponent; + } + + function doSetActive() { + loader.active = true; + } +} diff --git a/tests/auto/declarative/qquickloader/data/active.2.qml b/tests/auto/declarative/qquickloader/data/active.2.qml new file mode 100644 index 0000000000..e561744c63 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/active.2.qml @@ -0,0 +1,18 @@ +import QtQuick 2.0 + +Item { + id: root + + Loader { + id: loader + objectName: "loader" + source: "ActiveComponent.qml"; + + property int statusChangedCount: 0 + onStatusChanged: statusChangedCount = statusChangedCount + 1 + } + + function doSetInactive() { + loader.active = false; + } +} diff --git a/tests/auto/declarative/qquickloader/data/active.3.qml b/tests/auto/declarative/qquickloader/data/active.3.qml new file mode 100644 index 0000000000..0fbba959bb --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/active.3.qml @@ -0,0 +1,18 @@ +import QtQuick 2.0 + +Item { + id: root + + Loader { + id: loader + objectName: "loader" + source: "ActiveComponent.qml"; + + property int sourceChangedCount: 0 + onSourceChanged: sourceChangedCount = sourceChangedCount + 1 + } + + function doSetInactive() { + loader.active = false; + } +} diff --git a/tests/auto/declarative/qquickloader/data/active.4.qml b/tests/auto/declarative/qquickloader/data/active.4.qml new file mode 100644 index 0000000000..63fd46e2da --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/active.4.qml @@ -0,0 +1,26 @@ +import QtQuick 2.0 + +Item { + id: root + + Component { + id: inlineTestComponent + Item { + id: inlineTestItem + property int someProperty: 5 + } + } + + Loader { + id: loader + objectName: "loader" + sourceComponent: inlineTestComponent + + property int sourceComponentChangedCount: 0 + onSourceComponentChanged: sourceComponentChangedCount = sourceComponentChangedCount + 1 + } + + function doSetInactive() { + loader.active = false; + } +} diff --git a/tests/auto/declarative/qquickloader/data/active.5.qml b/tests/auto/declarative/qquickloader/data/active.5.qml new file mode 100644 index 0000000000..903f458a41 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/active.5.qml @@ -0,0 +1,18 @@ +import QtQuick 2.0 + +Item { + id: root + + Loader { + id: loader + objectName: "loader" + source: "ActiveComponent.qml"; + + property int itemChangedCount: 0 + onItemChanged: itemChangedCount = itemChangedCount + 1 + } + + function doSetInactive() { + loader.active = false; + } +} diff --git a/tests/auto/declarative/qquickloader/data/active.6.qml b/tests/auto/declarative/qquickloader/data/active.6.qml new file mode 100644 index 0000000000..f769a4e184 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/active.6.qml @@ -0,0 +1,21 @@ +import QtQuick 2.0 + +Item { + id: root + + Loader { + id: loader + objectName: "loader" + + property int activeChangedCount: 0 + onActiveChanged: activeChangedCount = activeChangedCount + 1 + } + + function doSetActive() { + loader.active = true; + } + + function doSetInactive() { + loader.active = false; + } +} diff --git a/tests/auto/declarative/qquickloader/data/active.7.qml b/tests/auto/declarative/qquickloader/data/active.7.qml new file mode 100644 index 0000000000..a29e932f5e --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/active.7.qml @@ -0,0 +1,14 @@ +import QtQuick 2.0 +Rectangle { + id: root + color: "blue" + width: 100; height: 100 + property bool success: true + + Loader { + active: false + anchors.fill: parent + sourceComponent: Rectangle { color: "red" } + onLoaded: { root.success = false; } // shouldn't be triggered if active is false + } +} diff --git a/tests/auto/declarative/qquickloader/data/active.8.qml b/tests/auto/declarative/qquickloader/data/active.8.qml new file mode 100644 index 0000000000..3a66d3e99a --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/active.8.qml @@ -0,0 +1,13 @@ +import QtQuick 2.0 +Rectangle { + id: root + color: "blue" + width: 100; height: 100 + property bool success: false + + Loader { + anchors.fill: parent + sourceComponent: Rectangle { color: "red" } + onLoaded: { root.success = true; } // should be triggered since active is true by default + } +} diff --git a/tests/auto/declarative/qquickloader/data/asynchronous.qml b/tests/auto/declarative/qquickloader/data/asynchronous.qml new file mode 100644 index 0000000000..29570525ad --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/asynchronous.qml @@ -0,0 +1,16 @@ +import QtQuick 2.0 + +Rectangle { + width: 400; height: 400 + + property string comp + function loadComponent() { + loader.source = comp + } + + Loader { + id: loader + objectName: "loader" + asynchronous: true + } +} diff --git a/tests/auto/declarative/qquickloader/data/crash.qml b/tests/auto/declarative/qquickloader/data/crash.qml new file mode 100644 index 0000000000..e6ddc33a10 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/crash.qml @@ -0,0 +1,14 @@ +import QtQuick 2.0 + +Rectangle { + width: 400 + height: 400 + + function setLoaderSource() { + myLoader.source = "GreenRect.qml" + } + + Loader { + id: myLoader + } +} diff --git a/tests/auto/declarative/qquickloader/data/creationContext.qml b/tests/auto/declarative/qquickloader/data/creationContext.qml new file mode 100644 index 0000000000..17a596cc74 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/creationContext.qml @@ -0,0 +1,8 @@ +import QtQuick 2.0 + +Item { + property bool test: false + + CreationContextLoader { + } +} diff --git a/tests/auto/declarative/qquickloader/data/differentorigin.qml b/tests/auto/declarative/qquickloader/data/differentorigin.qml new file mode 100644 index 0000000000..56a3034fe0 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/differentorigin.qml @@ -0,0 +1,3 @@ +import QtQuick 2.0 + +Loader { source: "http://evil.place/evil.qml" } diff --git a/tests/auto/declarative/qquickloader/data/implicitSize.qml b/tests/auto/declarative/qquickloader/data/implicitSize.qml new file mode 100644 index 0000000000..5c8c8348ed --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/implicitSize.qml @@ -0,0 +1,28 @@ +import QtQuick 2.0 + +Rectangle { + property real implWidth: 0 + property real implHeight: 0 + color: "green" + width: loader.implicitWidth+50 + height: loader.implicitHeight+50 + + Loader { + id: loader + sourceComponent: Item { + anchors.centerIn: parent + + implicitWidth: 100 + implicitHeight: 100 + Rectangle { + color: "red" + anchors.fill: parent + } + } + + anchors.fill: parent + anchors.margins: 50 + onImplicitWidthChanged: implWidth = implicitWidth + onImplicitHeightChanged: implHeight = loader.implicitHeight + } +} diff --git a/tests/auto/declarative/qquickloader/data/initialPropertyValues.1.qml b/tests/auto/declarative/qquickloader/data/initialPropertyValues.1.qml new file mode 100644 index 0000000000..ae371797ce --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/initialPropertyValues.1.qml @@ -0,0 +1,22 @@ +import QtQuick 2.0 + +Item { + id: root + property int initialValue: 0 + property int behaviorCount: 0 + + Loader { + id: loader + objectName: "loader" + + onLoaded: { + loader.item.canary = 1; // will trigger the behavior, setting behaviorCount -> 1 + } + } + + Component.onCompleted: { + loader.source = "InitialPropertyValuesComponent.qml"; + root.initialValue = loader.item.canary; // should be one, since onLoaded will have triggered by now + root.behaviorCount = loader.item.behaviorCount; // should be one, since onLoaded will have triggered by now + } +} diff --git a/tests/auto/declarative/qquickloader/data/initialPropertyValues.2.qml b/tests/auto/declarative/qquickloader/data/initialPropertyValues.2.qml new file mode 100644 index 0000000000..76c7bc2fd6 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/initialPropertyValues.2.qml @@ -0,0 +1,20 @@ +import QtQuick 2.0 + +Item { + id: root + property int initialValue: 0 + property int behaviorCount: 0 + + Loader { + id: loader + objectName: "loader" + onLoaded: { + root.initialValue = loader.item.canary; // should be two + root.behaviorCount = loader.item.behaviorCount; // should be zero + } + } + + Component.onCompleted: { + loader.setSource("InitialPropertyValuesComponent.qml", {"canary": 2}); + } +} diff --git a/tests/auto/declarative/qquickloader/data/initialPropertyValues.3.qml b/tests/auto/declarative/qquickloader/data/initialPropertyValues.3.qml new file mode 100644 index 0000000000..3b08e6ee42 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/initialPropertyValues.3.qml @@ -0,0 +1,18 @@ +import QtQuick 2.0 + +Item { + id: root + property int initialValue: 0 + property int behaviorCount: 0 + + Loader { + id: loader + objectName: "loader" + active: false + } + + Component.onCompleted: { + loader.setSource("InitialPropertyValuesComponent.qml", {"canary": 3}); + root.initialValue = loader.item.canary; // error - item should not yet exist. + } +} diff --git a/tests/auto/declarative/qquickloader/data/initialPropertyValues.4.qml b/tests/auto/declarative/qquickloader/data/initialPropertyValues.4.qml new file mode 100644 index 0000000000..e8310044e8 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/initialPropertyValues.4.qml @@ -0,0 +1,22 @@ +import QtQuick 2.0 + +Item { + id: root + property int initialValue: 0 + property int behaviorCount: 0 + + Loader { + id: loader + objectName: "loader" + active: false + onLoaded: { + root.initialValue = loader.item.canary; // should be four + root.behaviorCount = loader.item.behaviorCount; // should be zero + } + } + + Component.onCompleted: { + loader.setSource("InitialPropertyValuesComponent.qml", {"canary": 4}); + loader.active = true + } +} diff --git a/tests/auto/declarative/qquickloader/data/initialPropertyValues.5.qml b/tests/auto/declarative/qquickloader/data/initialPropertyValues.5.qml new file mode 100644 index 0000000000..03ee599aba --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/initialPropertyValues.5.qml @@ -0,0 +1,20 @@ +import QtQuick 2.0 + +Item { + id: root + property int initialValue: 0 + property int behaviorCount: 0 + + Loader { + id: loader + objectName: "loader" + onLoaded: { + root.initialValue = loader.item.canary; // should be zero, but no error + root.behaviorCount = loader.item.behaviorCount; // should be zero + } + } + + Component.onCompleted: { + loader.setSource("InitialPropertyValuesComponent.qml"); + } +} diff --git a/tests/auto/declarative/qquickloader/data/initialPropertyValues.6.qml b/tests/auto/declarative/qquickloader/data/initialPropertyValues.6.qml new file mode 100644 index 0000000000..66452b512b --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/initialPropertyValues.6.qml @@ -0,0 +1,25 @@ +import QtQuick 2.0 + +Item { + id: root + property int initialValue: 0 + property int behaviorCount: 0 + + Loader { + id: loader + objectName: "loader" + onLoaded: { + root.initialValue = loader.item.canary; // should be six + root.behaviorCount = loader.item.behaviorCount; // should be zero + } + } + + Item { + id: child + property int bindable: 6 + } + + Component.onCompleted: { + loader.setSource("InitialPropertyValuesComponent.qml", {"canary": child.bindable}); + } +} diff --git a/tests/auto/declarative/qquickloader/data/initialPropertyValues.7.qml b/tests/auto/declarative/qquickloader/data/initialPropertyValues.7.qml new file mode 100644 index 0000000000..02349f7ddf --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/initialPropertyValues.7.qml @@ -0,0 +1,29 @@ +import QtQuick 2.0 + +Item { + id: root + property int loaderValue: 0 + property int createObjectValue: 0 + + Loader { + id: loader + objectName: "loader" + onLoaded: { + root.loaderValue = loader.item.canary; // should still be one + } + } + + Item { + id: child + property int bindable: 1; + } + + property InitialPropertyValuesComponent ipvc + Component.onCompleted: { + loader.setSource("InitialPropertyValuesComponent.qml", {"canary": child.bindable}); + var dynComp = Qt.createComponent("InitialPropertyValuesComponent.qml"); + ipvc = dynComp.createObject(root, {"canary": child.bindable}); + child.bindable = 7; // won't cause re-evaluation, since not used in a binding. + root.createObjectValue = ipvc.canary; // should still be one + } +} diff --git a/tests/auto/declarative/qquickloader/data/initialPropertyValues.8.qml b/tests/auto/declarative/qquickloader/data/initialPropertyValues.8.qml new file mode 100644 index 0000000000..79e9264d4a --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/initialPropertyValues.8.qml @@ -0,0 +1,20 @@ +import QtQuick 2.0 + +Item { + id: root + property int initialValue: 0 + + Loader { + id: loader + objectName: "loader" + active: false + onLoaded: { + root.initialValue = loader.item.canary; // should be six + } + } + + Component.onCompleted: { + loader.setSource("http://127.0.0.1:14450/InitialPropertyValuesComponent.qml", {"canary": 6}); + loader.active = true; + } +} diff --git a/tests/auto/declarative/qquickloader/data/initialPropertyValues.binding.qml b/tests/auto/declarative/qquickloader/data/initialPropertyValues.binding.qml new file mode 100644 index 0000000000..e0df50a74a --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/initialPropertyValues.binding.qml @@ -0,0 +1,21 @@ +import QtQuick 2.0 + +Item { + id: root + + property InitialPropertyValuesComponent testInstance + testInstance: loader.item + + property int bindable: 1 + property int canaryValue: testInstance.canary + property int behaviorCount: testInstance.behaviorCount + + Loader { + id: loader + objectName: "loader" + } + + Component.onCompleted: { + loader.setSource("InitialPropertyValuesComponent.qml", {"canary": (function() { return root.bindable })}); + } +} diff --git a/tests/auto/declarative/qquickloader/data/initialPropertyValues.error.1.qml b/tests/auto/declarative/qquickloader/data/initialPropertyValues.error.1.qml new file mode 100644 index 0000000000..f324dbddac --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/initialPropertyValues.error.1.qml @@ -0,0 +1,14 @@ +import QtQuick 2.0 + +Item { + id: root + + Loader { + id: loader + objectName: "loader" + } + + Component.onCompleted: { + loader.setSource("InitialPropertyValuesComponent.qml", 3); // invalid initial properties object + } +} diff --git a/tests/auto/declarative/qquickloader/data/initialPropertyValues.error.2.qml b/tests/auto/declarative/qquickloader/data/initialPropertyValues.error.2.qml new file mode 100644 index 0000000000..89aba313c7 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/initialPropertyValues.error.2.qml @@ -0,0 +1,14 @@ +import QtQuick 2.0 + +Item { + id: root + + Loader { + id: loader + objectName: "loader" + } + + Component.onCompleted: { + loader.setSource("NonexistentSourceComponent.qml", {"canary":3}); + } +} diff --git a/tests/auto/declarative/qquickloader/data/initialPropertyValues.error.3.qml b/tests/auto/declarative/qquickloader/data/initialPropertyValues.error.3.qml new file mode 100644 index 0000000000..c862007402 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/initialPropertyValues.error.3.qml @@ -0,0 +1,14 @@ +import QtQuick 2.0 + +Item { + id: root + + Loader { + id: loader + objectName: "loader" + } + + Component.onCompleted: { + loader.setSource("InvalidSourceComponent.qml", {"canary":3}); + } +} diff --git a/tests/auto/declarative/qquickloader/data/initialPropertyValues.error.4.qml b/tests/auto/declarative/qquickloader/data/initialPropertyValues.error.4.qml new file mode 100644 index 0000000000..9a80b2156d --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/initialPropertyValues.error.4.qml @@ -0,0 +1,15 @@ +import QtQuick 2.0 + +Item { + id: root + property int canary: loader.item.canary + + Loader { + id: loader + objectName: "loader" + } + + Component.onCompleted: { + loader.setSource("InitialPropertyValuesComponent.qml", 3); // invalid initial properties object + } +} diff --git a/tests/auto/declarative/qquickloader/data/nonItem.qml b/tests/auto/declarative/qquickloader/data/nonItem.qml new file mode 100644 index 0000000000..8cfa0d8efb --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/nonItem.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 + +Loader { + sourceComponent: QtObject {} +} diff --git a/tests/auto/declarative/qquickloader/data/qmldir b/tests/auto/declarative/qquickloader/data/qmldir new file mode 100644 index 0000000000..bf42b507c0 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/qmldir @@ -0,0 +1 @@ +# For tst_QDeclarativeLoader::networkRequestUrl; no types needed though. diff --git a/tests/auto/declarative/qquickloader/data/sameorigin-load.qml b/tests/auto/declarative/qquickloader/data/sameorigin-load.qml new file mode 100644 index 0000000000..3332500be6 --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/sameorigin-load.qml @@ -0,0 +1,3 @@ +import QtQuick 2.0 + +Item { } diff --git a/tests/auto/declarative/qquickloader/data/sameorigin.qml b/tests/auto/declarative/qquickloader/data/sameorigin.qml new file mode 100644 index 0000000000..84846b6aba --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/sameorigin.qml @@ -0,0 +1,3 @@ +import QtQuick 2.0 + +Loader { source: "sameorigin-load.qml" } diff --git a/tests/auto/declarative/qquickloader/data/vmeErrors.qml b/tests/auto/declarative/qquickloader/data/vmeErrors.qml new file mode 100644 index 0000000000..8e6c89dc8e --- /dev/null +++ b/tests/auto/declarative/qquickloader/data/vmeErrors.qml @@ -0,0 +1,6 @@ +import QtQuick 2.0 + +Loader { + source: "VmeError.qml" +} + diff --git a/tests/auto/declarative/qquickloader/qquickloader.pro b/tests/auto/declarative/qquickloader/qquickloader.pro new file mode 100644 index 0000000000..9ccecce478 --- /dev/null +++ b/tests/auto/declarative/qquickloader/qquickloader.pro @@ -0,0 +1,16 @@ +CONFIG += testcase +TARGET = tst_qquickloader +macx:CONFIG -= app_bundle + +INCLUDEPATH += ../shared/ +HEADERS += ../shared/testhttpserver.h +SOURCES += tst_qquickloader.cpp \ + ../shared/testhttpserver.cpp + +testDataFiles.files = data +testDataFiles.path = . +DEPLOYMENT += testDataFiles + +CONFIG += parallel_test + +QT += core-private gui-private declarative-private network testlib diff --git a/tests/auto/declarative/qquickloader/tst_qquickloader.cpp b/tests/auto/declarative/qquickloader/tst_qquickloader.cpp new file mode 100644 index 0000000000..0096bc39b6 --- /dev/null +++ b/tests/auto/declarative/qquickloader/tst_qquickloader.cpp @@ -0,0 +1,950 @@ +/**************************************************************************** +** +** Copyright (C) 2011 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 <qtest.h> + +#include <QSignalSpy> + +#include <QtDeclarative/qdeclarativeengine.h> +#include <QtDeclarative/qdeclarativecomponent.h> +#include <QtDeclarative/qdeclarativeincubator.h> +#include <private/qquickloader_p.h> +#include "testhttpserver.h" +#include "../shared/util.h" + +#define SERVER_PORT 14450 + +inline QUrl TEST_FILE(const QString &filename) +{ + return QUrl::fromLocalFile(TESTDATA(filename)); +} + +class PeriodicIncubationController : public QObject, + public QDeclarativeIncubationController +{ +public: + PeriodicIncubationController() { + startTimer(16); + } + +protected: + virtual void timerEvent(QTimerEvent *) { + incubateFor(15); + } +}; + +class tst_QQuickLoader : public QObject + +{ + Q_OBJECT +public: + tst_QQuickLoader(); + +private slots: + void sourceOrComponent(); + void sourceOrComponent_data(); + void clear(); + void urlToComponent(); + void componentToUrl(); + void anchoredLoader(); + void sizeLoaderToItem(); + void sizeItemToLoader(); + void noResize(); + void networkRequestUrl(); + void failNetworkRequest(); +// void networkComponent(); + void active(); + void initialPropertyValues_data(); + void initialPropertyValues(); + void initialPropertyValuesBinding(); + void initialPropertyValuesError_data(); + void initialPropertyValuesError(); + + void deleteComponentCrash(); + void nonItem(); + void vmeErrors(); + void creationContext(); + void QTBUG_16928(); + void implicitSize(); + void QTBUG_17114(); + void asynchronous_data(); + void asynchronous(); + void asynchronous_clear(); + +private: + QDeclarativeEngine engine; +}; + + +tst_QQuickLoader::tst_QQuickLoader() +{ +} + +void tst_QQuickLoader::sourceOrComponent() +{ + QFETCH(QString, sourceOrComponent); + QFETCH(QString, sourceDefinition); + QFETCH(QUrl, sourceUrl); + QFETCH(QString, errorString); + + bool error = !errorString.isEmpty(); + if (error) + QTest::ignoreMessage(QtWarningMsg, errorString.toUtf8().constData()); + + QDeclarativeComponent component(&engine); + component.setData(QByteArray( + "import QtQuick 2.0\n" + "Loader {\n" + " property int onItemChangedCount: 0\n" + " property int onSourceChangedCount: 0\n" + " property int onSourceComponentChangedCount: 0\n" + " property int onStatusChangedCount: 0\n" + " property int onProgressChangedCount: 0\n" + " property int onLoadedCount: 0\n") + + sourceDefinition.toUtf8() + + QByteArray( + " onItemChanged: onItemChangedCount += 1\n" + " onSourceChanged: onSourceChangedCount += 1\n" + " onSourceComponentChanged: onSourceComponentChangedCount += 1\n" + " onStatusChanged: onStatusChangedCount += 1\n" + " onProgressChanged: onProgressChangedCount += 1\n" + " onLoaded: onLoadedCount += 1\n" + "}") + , TEST_FILE("")); + + QQuickLoader *loader = qobject_cast<QQuickLoader*>(component.create()); + QVERIFY(loader != 0); + QCOMPARE(loader->item() == 0, error); + QCOMPARE(loader->source(), sourceUrl); + QCOMPARE(loader->progress(), 1.0); + + QCOMPARE(loader->status(), error ? QQuickLoader::Error : QQuickLoader::Ready); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), error ? 0: 1); + + if (!error) { + bool sourceComponentIsChildOfLoader = false; + for (int ii = 0; ii < loader->children().size(); ++ii) { + QDeclarativeComponent *c = qobject_cast<QDeclarativeComponent*>(loader->children().at(ii)); + if (c && c == loader->sourceComponent()) { + sourceComponentIsChildOfLoader = true; + } + } + QVERIFY(sourceComponentIsChildOfLoader); + } + + if (sourceOrComponent == "component") { + QCOMPARE(loader->property("onSourceComponentChangedCount").toInt(), 1); + QCOMPARE(loader->property("onSourceChangedCount").toInt(), 0); + } else { + QCOMPARE(loader->property("onSourceComponentChangedCount").toInt(), 0); + QCOMPARE(loader->property("onSourceChangedCount").toInt(), 1); + } + QCOMPARE(loader->property("onStatusChangedCount").toInt(), 1); + QCOMPARE(loader->property("onProgressChangedCount").toInt(), 1); + + QCOMPARE(loader->property("onItemChangedCount").toInt(), error ? 0 : 1); + QCOMPARE(loader->property("onLoadedCount").toInt(), error ? 0 : 1); + + delete loader; +} + +void tst_QQuickLoader::sourceOrComponent_data() +{ + QTest::addColumn<QString>("sourceOrComponent"); + QTest::addColumn<QString>("sourceDefinition"); + QTest::addColumn<QUrl>("sourceUrl"); + QTest::addColumn<QString>("errorString"); + + QTest::newRow("source") << "source" << "source: 'Rect120x60.qml'\n" << QUrl::fromLocalFile(TESTDATA("Rect120x60.qml")) << ""; + QTest::newRow("sourceComponent") << "component" << "Component { id: comp; Rectangle { width: 100; height: 50 } }\n sourceComponent: comp\n" << QUrl() << ""; + QTest::newRow("invalid source") << "source" << "source: 'IDontExist.qml'\n" << QUrl::fromLocalFile(TESTDATA("IDontExist.qml")) + << QString(QUrl::fromLocalFile(TESTDATA("IDontExist.qml")).toString() + ": File not found"); +} + +void tst_QQuickLoader::clear() +{ + { + QDeclarativeComponent component(&engine); + component.setData(QByteArray( + "import QtQuick 2.0\n" + " Loader { id: loader\n" + " source: 'Rect120x60.qml'\n" + " Timer { interval: 200; running: true; onTriggered: loader.source = '' }\n" + " }") + , TEST_FILE("")); + QQuickLoader *loader = qobject_cast<QQuickLoader*>(component.create()); + QVERIFY(loader != 0); + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 1); + + QTRY_VERIFY(loader->item() == 0); + QCOMPARE(loader->progress(), 0.0); + QCOMPARE(loader->status(), QQuickLoader::Null); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 0); + + delete loader; + } + { + QDeclarativeComponent component(&engine, TEST_FILE("/SetSourceComponent.qml")); + QQuickItem *item = qobject_cast<QQuickItem*>(component.create()); + QVERIFY(item); + + QQuickLoader *loader = qobject_cast<QQuickLoader*>(item->QQuickItem::childItems().at(0)); + QVERIFY(loader); + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 1); + + loader->setSourceComponent(0); + + QVERIFY(loader->item() == 0); + QCOMPARE(loader->progress(), 0.0); + QCOMPARE(loader->status(), QQuickLoader::Null); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 0); + + delete item; + } + { + QDeclarativeComponent component(&engine, TEST_FILE("/SetSourceComponent.qml")); + QQuickItem *item = qobject_cast<QQuickItem*>(component.create()); + QVERIFY(item); + + QQuickLoader *loader = qobject_cast<QQuickLoader*>(item->QQuickItem::childItems().at(0)); + QVERIFY(loader); + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 1); + + QMetaObject::invokeMethod(item, "clear"); + + QVERIFY(loader->item() == 0); + QCOMPARE(loader->progress(), 0.0); + QCOMPARE(loader->status(), QQuickLoader::Null); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 0); + + delete item; + } +} + +void tst_QQuickLoader::urlToComponent() +{ + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 2.0\n" + "Loader {\n" + " id: loader\n" + " Component { id: myComp; Rectangle { width: 10; height: 10 } }\n" + " source: \"Rect120x60.qml\"\n" + " Timer { interval: 100; running: true; onTriggered: loader.sourceComponent = myComp }\n" + "}" ) + , TEST_FILE("")); + QQuickLoader *loader = qobject_cast<QQuickLoader*>(component.create()); + QTest::qWait(200); + QTRY_VERIFY(loader != 0); + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 1); + QCOMPARE(loader->width(), 10.0); + QCOMPARE(loader->height(), 10.0); + + delete loader; +} + +void tst_QQuickLoader::componentToUrl() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/SetSourceComponent.qml")); + QQuickItem *item = qobject_cast<QQuickItem*>(component.create()); + QVERIFY(item); + + QQuickLoader *loader = qobject_cast<QQuickLoader*>(item->QQuickItem::childItems().at(0)); + QVERIFY(loader); + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 1); + + loader->setSource(TEST_FILE("/Rect120x60.qml")); + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 1); + QCOMPARE(loader->width(), 120.0); + QCOMPARE(loader->height(), 60.0); + + delete item; +} + +void tst_QQuickLoader::anchoredLoader() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/AnchoredLoader.qml")); + QQuickItem *rootItem = qobject_cast<QQuickItem*>(component.create()); + QVERIFY(rootItem != 0); + QQuickItem *loader = rootItem->findChild<QQuickItem*>("loader"); + QQuickItem *sourceElement = rootItem->findChild<QQuickItem*>("sourceElement"); + + QVERIFY(loader != 0); + QVERIFY(sourceElement != 0); + + QCOMPARE(rootItem->width(), 300.0); + QCOMPARE(rootItem->height(), 200.0); + + QCOMPARE(loader->width(), 300.0); + QCOMPARE(loader->height(), 200.0); + + QCOMPARE(sourceElement->width(), 300.0); + QCOMPARE(sourceElement->height(), 200.0); +} + +void tst_QQuickLoader::sizeLoaderToItem() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/SizeToItem.qml")); + QQuickLoader *loader = qobject_cast<QQuickLoader*>(component.create()); + QVERIFY(loader != 0); + QCOMPARE(loader->width(), 120.0); + QCOMPARE(loader->height(), 60.0); + + // Check resize + QQuickItem *rect = qobject_cast<QQuickItem*>(loader->item()); + QVERIFY(rect); + rect->setWidth(150); + rect->setHeight(45); + QCOMPARE(loader->width(), 150.0); + QCOMPARE(loader->height(), 45.0); + + // Check explicit width + loader->setWidth(200.0); + QCOMPARE(loader->width(), 200.0); + QCOMPARE(rect->width(), 200.0); + rect->setWidth(100.0); // when rect changes ... + QCOMPARE(rect->width(), 100.0); // ... it changes + QCOMPARE(loader->width(), 200.0); // ... but loader stays the same + + // Check explicit height + loader->setHeight(200.0); + QCOMPARE(loader->height(), 200.0); + QCOMPARE(rect->height(), 200.0); + rect->setHeight(100.0); // when rect changes ... + QCOMPARE(rect->height(), 100.0); // ... it changes + QCOMPARE(loader->height(), 200.0); // ... but loader stays the same + + // Switch mode + loader->setWidth(180); + loader->setHeight(30); + QCOMPARE(rect->width(), 180.0); + QCOMPARE(rect->height(), 30.0); + + delete loader; +} + +void tst_QQuickLoader::sizeItemToLoader() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/SizeToLoader.qml")); + QQuickLoader *loader = qobject_cast<QQuickLoader*>(component.create()); + QVERIFY(loader != 0); + QCOMPARE(loader->width(), 200.0); + QCOMPARE(loader->height(), 80.0); + + QQuickItem *rect = qobject_cast<QQuickItem*>(loader->item()); + QVERIFY(rect); + QCOMPARE(rect->width(), 200.0); + QCOMPARE(rect->height(), 80.0); + + // Check resize + loader->setWidth(180); + loader->setHeight(30); + QCOMPARE(rect->width(), 180.0); + QCOMPARE(rect->height(), 30.0); + + // Switch mode + loader->resetWidth(); // reset explicit size + loader->resetHeight(); + rect->setWidth(160); + rect->setHeight(45); + QCOMPARE(loader->width(), 160.0); + QCOMPARE(loader->height(), 45.0); + + delete loader; +} + +void tst_QQuickLoader::noResize() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/NoResize.qml")); + QQuickItem* item = qobject_cast<QQuickItem*>(component.create()); + QVERIFY(item != 0); + QCOMPARE(item->width(), 200.0); + QCOMPARE(item->height(), 80.0); + + delete item; +} + +void tst_QQuickLoader::networkRequestUrl() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory(TESTDATA("")); + + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 2.0\nLoader { property int signalCount : 0; source: \"http://127.0.0.1:14450/Rect120x60.qml\"; onLoaded: signalCount += 1 }"), QUrl::fromLocalFile(TESTDATA("../dummy.qml"))); + if (component.isError()) + qDebug() << component.errors(); + QQuickLoader *loader = qobject_cast<QQuickLoader*>(component.create()); + QVERIFY(loader != 0); + + QTRY_VERIFY(loader->status() == QQuickLoader::Ready); + + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(loader->property("signalCount").toInt(), 1); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 1); + + delete loader; +} + +/* XXX Component waits until all dependencies are loaded. Is this actually possible? +void tst_QQuickLoader::networkComponent() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory("slowdata", TestHTTPServer::Delay); + + QDeclarativeComponent component(&engine); + component.setData(QByteArray( + "import QtQuick 2.0\n" + "import \"http://127.0.0.1:14450/\" as NW\n" + "Item {\n" + " Component { id: comp; NW.SlowRect {} }\n" + " Loader { sourceComponent: comp } }") + , TEST_FILE("")); + + QQuickItem *item = qobject_cast<QQuickItem*>(component.create()); + QVERIFY(item); + + QQuickLoader *loader = qobject_cast<QQuickLoader*>(item->QQuickItem::children().at(1)); + QVERIFY(loader); + QTRY_VERIFY(loader->status() == QQuickLoader::Ready); + + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(loader->status(), QQuickLoader::Ready); + QCOMPARE(static_cast<QQuickItem*>(loader)->children().count(), 1); + + delete loader; +} +*/ + +void tst_QQuickLoader::failNetworkRequest() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory(TESTDATA("")); + + QTest::ignoreMessage(QtWarningMsg, "http://127.0.0.1:14450/IDontExist.qml: File not found"); + + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 2.0\nLoader { property int did_load: 123; source: \"http://127.0.0.1:14450/IDontExist.qml\"; onLoaded: did_load=456 }"), QUrl::fromLocalFile("http://127.0.0.1:14450/dummy.qml")); + QQuickLoader *loader = qobject_cast<QQuickLoader*>(component.create()); + QVERIFY(loader != 0); + + QTRY_VERIFY(loader->status() == QQuickLoader::Error); + + QVERIFY(loader->item() == 0); + QCOMPARE(loader->progress(), 0.0); + QCOMPARE(loader->property("did_load").toInt(), 123); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 0); + + delete loader; +} + +void tst_QQuickLoader::active() +{ + // check that the item isn't instantiated until active is set to true + { + QDeclarativeComponent component(&engine, TEST_FILE("active.1.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QQuickLoader *loader = object->findChild<QQuickLoader*>("loader"); + + QVERIFY(loader->active() == false); // set manually to false + QVERIFY(loader->item() == 0); + QMetaObject::invokeMethod(object, "doSetSourceComponent"); + QVERIFY(loader->item() == 0); + QMetaObject::invokeMethod(object, "doSetSource"); + QVERIFY(loader->item() == 0); + QMetaObject::invokeMethod(object, "doSetActive"); + QVERIFY(loader->item() != 0); + + delete object; + } + + // check that the status is Null if active is set to false + { + QDeclarativeComponent component(&engine, TEST_FILE("active.2.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QQuickLoader *loader = object->findChild<QQuickLoader*>("loader"); + + QVERIFY(loader->active() == true); // active is true by default + QCOMPARE(loader->status(), QQuickLoader::Ready); + int currStatusChangedCount = loader->property("statusChangedCount").toInt(); + QMetaObject::invokeMethod(object, "doSetInactive"); + QCOMPARE(loader->status(), QQuickLoader::Null); + QCOMPARE(loader->property("statusChangedCount").toInt(), (currStatusChangedCount+1)); + + delete object; + } + + // check that the source is not cleared if active is set to false + { + QDeclarativeComponent component(&engine, TEST_FILE("active.3.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QQuickLoader *loader = object->findChild<QQuickLoader*>("loader"); + + QVERIFY(loader->active() == true); // active is true by default + QVERIFY(!loader->source().isEmpty()); + int currSourceChangedCount = loader->property("sourceChangedCount").toInt(); + QMetaObject::invokeMethod(object, "doSetInactive"); + QVERIFY(!loader->source().isEmpty()); + QCOMPARE(loader->property("sourceChangedCount").toInt(), currSourceChangedCount); + + delete object; + } + + // check that the sourceComponent is not cleared if active is set to false + { + QDeclarativeComponent component(&engine, TEST_FILE("active.4.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QQuickLoader *loader = object->findChild<QQuickLoader*>("loader"); + + QVERIFY(loader->active() == true); // active is true by default + QVERIFY(loader->sourceComponent() != 0); + int currSourceComponentChangedCount = loader->property("sourceComponentChangedCount").toInt(); + QMetaObject::invokeMethod(object, "doSetInactive"); + QVERIFY(loader->sourceComponent() != 0); + QCOMPARE(loader->property("sourceComponentChangedCount").toInt(), currSourceComponentChangedCount); + + delete object; + } + + // check that the item is released if active is set to false + { + QDeclarativeComponent component(&engine, TEST_FILE("active.5.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QQuickLoader *loader = object->findChild<QQuickLoader*>("loader"); + + QVERIFY(loader->active() == true); // active is true by default + QVERIFY(loader->item() != 0); + int currItemChangedCount = loader->property("itemChangedCount").toInt(); + QMetaObject::invokeMethod(object, "doSetInactive"); + QVERIFY(loader->item() == 0); + QCOMPARE(loader->property("itemChangedCount").toInt(), (currItemChangedCount+1)); + + delete object; + } + + // check that the activeChanged signal is emitted correctly + { + QDeclarativeComponent component(&engine, TEST_FILE("active.6.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QQuickLoader *loader = object->findChild<QQuickLoader*>("loader"); + + QVERIFY(loader->active() == true); // active is true by default + loader->setActive(true); // no effect + QCOMPARE(loader->property("activeChangedCount").toInt(), 0); + loader->setActive(false); // change signal should be emitted + QCOMPARE(loader->property("activeChangedCount").toInt(), 1); + loader->setActive(false); // no effect + QCOMPARE(loader->property("activeChangedCount").toInt(), 1); + loader->setActive(true); // change signal should be emitted + QCOMPARE(loader->property("activeChangedCount").toInt(), 2); + loader->setActive(false); // change signal should be emitted + QCOMPARE(loader->property("activeChangedCount").toInt(), 3); + QMetaObject::invokeMethod(object, "doSetActive"); + QCOMPARE(loader->property("activeChangedCount").toInt(), 4); + QMetaObject::invokeMethod(object, "doSetActive"); + QCOMPARE(loader->property("activeChangedCount").toInt(), 4); + QMetaObject::invokeMethod(object, "doSetInactive"); + QCOMPARE(loader->property("activeChangedCount").toInt(), 5); + loader->setActive(true); // change signal should be emitted + QCOMPARE(loader->property("activeChangedCount").toInt(), 6); + + delete object; + } + + // check that the component isn't loaded until active is set to true + { + QDeclarativeComponent component(&engine, TEST_FILE("active.7.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("success").toBool(), true); + delete object; + } + + // check that the component is loaded if active is not set (true by default) + { + QDeclarativeComponent component(&engine, TEST_FILE("active.8.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("success").toBool(), true); + delete object; + } +} + +void tst_QQuickLoader::initialPropertyValues_data() +{ + QTest::addColumn<QUrl>("qmlFile"); + QTest::addColumn<QStringList>("expectedWarnings"); + QTest::addColumn<QStringList>("propertyNames"); + QTest::addColumn<QVariantList>("propertyValues"); + + QTest::newRow("source url with value set in onLoaded, initially active = true") << TEST_FILE("initialPropertyValues.1.qml") + << QStringList() + << (QStringList() << "initialValue" << "behaviorCount") + << (QVariantList() << 1 << 1); + + QTest::newRow("set source with initial property values specified, active = true") << TEST_FILE("initialPropertyValues.2.qml") + << QStringList() + << (QStringList() << "initialValue" << "behaviorCount") + << (QVariantList() << 2 << 0); + + QTest::newRow("set source with initial property values specified, active = false") << TEST_FILE("initialPropertyValues.3.qml") + << (QStringList() << QString(QLatin1String("file://") + TEST_FILE("initialPropertyValues.3.qml").toLocalFile() + QLatin1String(":16: TypeError: Cannot read property 'canary' of null"))) + << (QStringList()) + << (QVariantList()); + + QTest::newRow("set source with initial property values specified, active = false, with active set true later") << TEST_FILE("initialPropertyValues.4.qml") + << QStringList() + << (QStringList() << "initialValue" << "behaviorCount") + << (QVariantList() << 4 << 0); + + QTest::newRow("set source without initial property values specified, active = true") << TEST_FILE("initialPropertyValues.5.qml") + << QStringList() + << (QStringList() << "initialValue" << "behaviorCount") + << (QVariantList() << 0 << 0); + + QTest::newRow("set source with initial property values specified with binding, active = true") << TEST_FILE("initialPropertyValues.6.qml") + << QStringList() + << (QStringList() << "initialValue" << "behaviorCount") + << (QVariantList() << 6 << 0); + + QTest::newRow("ensure initial property value semantics mimic createObject") << TEST_FILE("initialPropertyValues.7.qml") + << QStringList() + << (QStringList() << "loaderValue" << "createObjectValue") + << (QVariantList() << 1 << 1); + + QTest::newRow("ensure initial property values aren't disposed prior to component completion") << TEST_FILE("initialPropertyValues.8.qml") + << QStringList() + << (QStringList() << "initialValue") + << (QVariantList() << 6); +} + +void tst_QQuickLoader::initialPropertyValues() +{ + QFETCH(QUrl, qmlFile); + QFETCH(QStringList, expectedWarnings); + QFETCH(QStringList, propertyNames); + QFETCH(QVariantList, propertyValues); + + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory(TESTDATA("")); + + foreach (const QString &warning, expectedWarnings) + QTest::ignoreMessage(QtWarningMsg, warning.toAscii().constData()); + + QDeclarativeComponent component(&engine, qmlFile); + QObject *object = component.create(); + QVERIFY(object != 0); + qApp->processEvents(); + QTest::qWait(50); + + for (int i = 0; i < propertyNames.size(); ++i) + QCOMPARE(object->property(propertyNames.at(i).toAscii().constData()), propertyValues.at(i)); + + delete object; +} + +void tst_QQuickLoader::initialPropertyValuesBinding() +{ + QDeclarativeComponent component(&engine, TEST_FILE("initialPropertyValues.binding.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QVERIFY(object->setProperty("bindable", QVariant(8))); + QCOMPARE(object->property("canaryValue").toInt(), 8); + + delete object; +} + +void tst_QQuickLoader::initialPropertyValuesError_data() +{ + QTest::addColumn<QUrl>("qmlFile"); + QTest::addColumn<QStringList>("expectedWarnings"); + + QTest::newRow("invalid initial property values object") << TEST_FILE("initialPropertyValues.error.1.qml") + << (QStringList() << QString(TEST_FILE("initialPropertyValues.error.1.qml").toString() + ":6:5: QML Loader: setSource: value is not an object")); + + QTest::newRow("nonexistent source url") << TEST_FILE("initialPropertyValues.error.2.qml") + << (QStringList() << QString(TEST_FILE("NonexistentSourceComponent.qml").toString() + ": File not found")); + + QTest::newRow("invalid source url") << TEST_FILE("initialPropertyValues.error.3.qml") + << (QStringList() << QString(TEST_FILE("InvalidSourceComponent.qml").toString() + ":5:1: Syntax error")); + + QTest::newRow("invalid initial property values object with invalid property access") << TEST_FILE("initialPropertyValues.error.4.qml") + << (QStringList() << QString(TEST_FILE("initialPropertyValues.error.4.qml").toString() + ":7:5: QML Loader: setSource: value is not an object") + << QString(TEST_FILE("initialPropertyValues.error.4.qml").toString() + ":5: TypeError: Cannot read property 'canary' of null")); +} + +void tst_QQuickLoader::initialPropertyValuesError() +{ + QFETCH(QUrl, qmlFile); + QFETCH(QStringList, expectedWarnings); + + foreach (const QString &warning, expectedWarnings) + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8().constData()); + + QDeclarativeComponent component(&engine, qmlFile); + QObject *object = component.create(); + QVERIFY(object != 0); + QQuickLoader *loader = object->findChild<QQuickLoader*>("loader"); + QVERIFY(loader != 0); + QVERIFY(loader->item() == 0); + delete object; +} + +// QTBUG-9241 +void tst_QQuickLoader::deleteComponentCrash() +{ + QDeclarativeComponent component(&engine, TEST_FILE("crash.qml")); + QQuickItem *item = qobject_cast<QQuickItem*>(component.create()); + QVERIFY(item); + + item->metaObject()->invokeMethod(item, "setLoaderSource"); + + QQuickLoader *loader = qobject_cast<QQuickLoader*>(item->QQuickItem::childItems().at(0)); + QVERIFY(loader); + QVERIFY(loader->item()); + QCOMPARE(loader->item()->objectName(), QLatin1String("blue")); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(loader->status(), QQuickLoader::Ready); + qApp->processEvents(QEventLoop::DeferredDeletion); + QTRY_COMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 1); + QVERIFY(loader->source() == QUrl::fromLocalFile(TESTDATA("BlueRect.qml"))); + + delete item; +} + +void tst_QQuickLoader::nonItem() +{ + QDeclarativeComponent component(&engine, TEST_FILE("nonItem.qml")); + QString err = QUrl::fromLocalFile(TESTDATA("nonItem.qml")).toString() + ":3:1: QML Loader: Loader does not support loading non-visual elements."; + + QTest::ignoreMessage(QtWarningMsg, err.toLatin1().constData()); + QQuickLoader *loader = qobject_cast<QQuickLoader*>(component.create()); + QVERIFY(loader); + QVERIFY(loader->item() == 0); + + delete loader; +} + +void tst_QQuickLoader::vmeErrors() +{ + QDeclarativeComponent component(&engine, TEST_FILE("vmeErrors.qml")); + QString err = QUrl::fromLocalFile(TESTDATA("VmeError.qml")).toString() + ":6: Cannot assign object type QObject with no default method"; + QTest::ignoreMessage(QtWarningMsg, err.toLatin1().constData()); + QQuickLoader *loader = qobject_cast<QQuickLoader*>(component.create()); + QVERIFY(loader); + QVERIFY(loader->item() == 0); + + delete loader; +} + +// QTBUG-13481 +void tst_QQuickLoader::creationContext() +{ + QDeclarativeComponent component(&engine, TEST_FILE("creationContext.qml")); + + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; +} + +void tst_QQuickLoader::QTBUG_16928() +{ + QDeclarativeComponent component(&engine, TEST_FILE("QTBUG_16928.qml")); + QQuickItem *item = qobject_cast<QQuickItem*>(component.create()); + QVERIFY(item); + + QCOMPARE(item->width(), 250.); + QCOMPARE(item->height(), 250.); + + delete item; +} + +void tst_QQuickLoader::implicitSize() +{ + QDeclarativeComponent component(&engine, TEST_FILE("implicitSize.qml")); + QQuickItem *item = qobject_cast<QQuickItem*>(component.create()); + QVERIFY(item); + + QCOMPARE(item->width(), 150.); + QCOMPARE(item->height(), 150.); + + QCOMPARE(item->property("implHeight").toReal(), 100.); + QCOMPARE(item->property("implWidth").toReal(), 100.); + + delete item; +} + +void tst_QQuickLoader::QTBUG_17114() +{ + QDeclarativeComponent component(&engine, TEST_FILE("QTBUG_17114.qml")); + QQuickItem *item = qobject_cast<QQuickItem*>(component.create()); + QVERIFY(item); + + QCOMPARE(item->property("loaderWidth").toReal(), 32.); + QCOMPARE(item->property("loaderHeight").toReal(), 32.); + + delete item; +} + +void tst_QQuickLoader::asynchronous_data() +{ + QTest::addColumn<QUrl>("qmlFile"); + QTest::addColumn<QStringList>("expectedWarnings"); + + QTest::newRow("Valid component") << TEST_FILE("BigComponent.qml") + << QStringList(); + + QTest::newRow("Non-existant component") << TEST_FILE("IDoNotExist.qml") + << (QStringList() << QString(TEST_FILE("IDoNotExist.qml").toString() + ": File not found")); + + QTest::newRow("Invalid component") << TEST_FILE("InvalidSourceComponent.qml") + << (QStringList() << QString(TEST_FILE("InvalidSourceComponent.qml").toString() + ":5:1: Syntax error")); +} + +void tst_QQuickLoader::asynchronous() +{ + QFETCH(QUrl, qmlFile); + QFETCH(QStringList, expectedWarnings); + + if (!engine.incubationController()) + engine.setIncubationController(new PeriodicIncubationController); + QDeclarativeComponent component(&engine, TEST_FILE("asynchronous.qml")); + QQuickItem *root = qobject_cast<QQuickItem*>(component.create()); + QVERIFY(root); + + QQuickLoader *loader = root->findChild<QQuickLoader*>("loader"); + QVERIFY(loader); + + foreach (const QString &warning, expectedWarnings) + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8().constData()); + + QVERIFY(!loader->item()); + root->setProperty("comp", qmlFile.toString()); + QMetaObject::invokeMethod(root, "loadComponent"); + QVERIFY(!loader->item()); + + if (expectedWarnings.isEmpty()) { + QCOMPARE(loader->status(), QQuickLoader::Loading); + QCOMPARE(engine.incubationController()->incubatingObjectCount(), 1); + + QTRY_VERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(loader->status(), QQuickLoader::Ready); + } else { + QCOMPARE(loader->progress(), 1.0); + QTRY_COMPARE(loader->status(), QQuickLoader::Error); + } + + delete root; +} + +void tst_QQuickLoader::asynchronous_clear() +{ + if (!engine.incubationController()) + engine.setIncubationController(new PeriodicIncubationController); + QDeclarativeComponent component(&engine, TEST_FILE("asynchronous.qml")); + QQuickItem *root = qobject_cast<QQuickItem*>(component.create()); + QVERIFY(root); + + QQuickLoader *loader = root->findChild<QQuickLoader*>("loader"); + QVERIFY(loader); + + QVERIFY(!loader->item()); + root->setProperty("comp", "BigComponent.qml"); + QMetaObject::invokeMethod(root, "loadComponent"); + QVERIFY(!loader->item()); + + QCOMPARE(loader->status(), QQuickLoader::Loading); + QCOMPARE(engine.incubationController()->incubatingObjectCount(), 1); + + // clear before component created + root->setProperty("comp", ""); + QMetaObject::invokeMethod(root, "loadComponent"); + QVERIFY(!loader->item()); + QCOMPARE(engine.incubationController()->incubatingObjectCount(), 0); + + QCOMPARE(loader->progress(), 0.0); + QCOMPARE(loader->status(), QQuickLoader::Null); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 0); + + // check loading component + root->setProperty("comp", "Rect120x60.qml"); + QMetaObject::invokeMethod(root, "loadComponent"); + QVERIFY(!loader->item()); + + QCOMPARE(loader->status(), QQuickLoader::Loading); + QCOMPARE(engine.incubationController()->incubatingObjectCount(), 1); + + QTRY_VERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(loader->status(), QQuickLoader::Ready); + QCOMPARE(static_cast<QQuickItem*>(loader)->childItems().count(), 1); +} + + +QTEST_MAIN(tst_QQuickLoader) + +#include "tst_qquickloader.moc" |