summaryrefslogtreecommitdiffstats
path: root/tests/auto/declarative
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/declarative')
-rw-r--r--tests/auto/declarative/.gitignore3
-rw-r--r--tests/auto/declarative/datetimeformatter/datetimeformatter.pro3
-rw-r--r--tests/auto/declarative/datetimeformatter/tst_datetimeformatter.cpp83
-rw-r--r--tests/auto/declarative/declarative.pro22
-rw-r--r--tests/auto/declarative/layouts/data/grid-margin.xml9
-rw-r--r--tests/auto/declarative/layouts/data/grid-spacing-margin.xml9
-rw-r--r--tests/auto/declarative/layouts/data/grid-spacing.xml9
-rw-r--r--tests/auto/declarative/layouts/data/grid.xml9
-rw-r--r--tests/auto/declarative/layouts/data/horizontal-margin.xml7
-rw-r--r--tests/auto/declarative/layouts/data/horizontal-spacing-margin.xml7
-rw-r--r--tests/auto/declarative/layouts/data/horizontal-spacing.xml7
-rw-r--r--tests/auto/declarative/layouts/data/horizontal.xml7
-rw-r--r--tests/auto/declarative/layouts/data/vertical-margin.xml7
-rw-r--r--tests/auto/declarative/layouts/data/vertical-spacing-margin.xml7
-rw-r--r--tests/auto/declarative/layouts/data/vertical-spacing.xml7
-rw-r--r--tests/auto/declarative/layouts/data/vertical.xml7
-rw-r--r--tests/auto/declarative/layouts/layouts.pro6
-rw-r--r--tests/auto/declarative/layouts/tst_layouts.cpp392
-rw-r--r--tests/auto/declarative/listview/data/listview.xml14
-rw-r--r--tests/auto/declarative/listview/listview.pro6
-rw-r--r--tests/auto/declarative/listview/tst_listview.cpp484
-rw-r--r--tests/auto/declarative/namespaces/data/Red/Rect.qml2
-rw-r--r--tests/auto/declarative/namespaces/namespaces.pro6
-rw-r--r--tests/auto/declarative/namespaces/tst_namespaces.cpp94
-rw-r--r--tests/auto/declarative/numberformatter/numberformatter.pro3
-rw-r--r--tests/auto/declarative/numberformatter/tst_numberformatter.cpp216
-rw-r--r--tests/auto/declarative/pathview/data/pathview.xml20
-rw-r--r--tests/auto/declarative/pathview/pathview.pro6
-rw-r--r--tests/auto/declarative/pathview/tst_pathview.cpp259
-rw-r--r--tests/auto/declarative/qbindablemap/qbindablemap.pro3
-rw-r--r--tests/auto/declarative/qbindablemap/tst_qbindablemap.cpp72
-rw-r--r--tests/auto/declarative/qfxtext/qfxtext.pro3
-rw-r--r--tests/auto/declarative/qfxtext/tst_qfxtext.cpp412
-rw-r--r--tests/auto/declarative/qfxtextedit/qfxtextedit.pro3
-rw-r--r--tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp326
-rw-r--r--tests/auto/declarative/qmlbindengine/qmlbindengine.pro3
-rw-r--r--tests/auto/declarative/qmlbindengine/tst_qmlbindengine.cpp123
-rw-r--r--tests/auto/declarative/qmllist/qmllist.pro3
-rw-r--r--tests/auto/declarative/qmllist/tst_qmllist.cpp38
-rw-r--r--tests/auto/declarative/qmllistaccessor/qmllistaccessor.pro3
-rw-r--r--tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp61
-rw-r--r--tests/auto/declarative/qmlmetaproperty/qmlmetaproperty.pro3
-rw-r--r--tests/auto/declarative/qmlmetaproperty/tst_qmlmetaproperty.cpp104
-rw-r--r--tests/auto/declarative/qmlparser/qmlparser.pro3
-rw-r--r--tests/auto/declarative/qmlparser/tst_qmlparser.cpp444
-rw-r--r--tests/auto/declarative/repeater/data/repeater.xml7
-rw-r--r--tests/auto/declarative/repeater/repeater.pro6
-rw-r--r--tests/auto/declarative/repeater/tst_repeater.cpp91
-rw-r--r--tests/auto/declarative/simplecanvasitem/data/test.xml12
-rw-r--r--tests/auto/declarative/simplecanvasitem/simplecanvasitem.pro6
-rw-r--r--tests/auto/declarative/simplecanvasitem/tst_simplecanvasitem.cpp79
-rw-r--r--tests/auto/declarative/visual/ListView/basic1/basic1.xml19
-rw-r--r--tests/auto/declarative/visual/ListView/basic1/data/opengl/image0.pngbin0 -> 3759 bytes
-rw-r--r--tests/auto/declarative/visual/ListView/basic1/data/opengl/manifest.xml4
-rw-r--r--tests/auto/declarative/visual/ListView/basic1/test1
-rw-r--r--tests/auto/declarative/visual/ListView/basic2/basic2.xml20
-rw-r--r--tests/auto/declarative/visual/ListView/basic2/data/opengl/image0.pngbin0 -> 3759 bytes
-rw-r--r--tests/auto/declarative/visual/ListView/basic2/data/opengl/manifest.xml4
-rw-r--r--tests/auto/declarative/visual/ListView/basic2/test1
-rw-r--r--tests/auto/declarative/visual/ListView/basic3/basic3.xml18
-rw-r--r--tests/auto/declarative/visual/ListView/basic3/data/opengl/image0.pngbin0 -> 3759 bytes
-rw-r--r--tests/auto/declarative/visual/ListView/basic3/data/opengl/manifest.xml4
-rw-r--r--tests/auto/declarative/visual/ListView/basic3/test1
-rw-r--r--tests/auto/declarative/visual/ListView/basic4/basic4.xml19
-rw-r--r--tests/auto/declarative/visual/ListView/basic4/data/opengl/image0.pngbin0 -> 3759 bytes
-rw-r--r--tests/auto/declarative/visual/ListView/basic4/data/opengl/manifest.xml4
-rw-r--r--tests/auto/declarative/visual/ListView/basic4/test1
-rw-r--r--tests/auto/declarative/visual/bindinganimation/bindinganimation.xml19
-rw-r--r--tests/auto/declarative/visual/bindinganimation/data/opengl/image0.pngbin0 -> 817 bytes
-rw-r--r--tests/auto/declarative/visual/bindinganimation/data/opengl/manifest-play.xml104
-rw-r--r--tests/auto/declarative/visual/bindinganimation/data/opengl/manifest.xml104
-rw-r--r--tests/auto/declarative/visual/bindinganimation/test1
-rw-r--r--tests/auto/declarative/visual/colorAnimation/colorAnimation.xml18
-rw-r--r--tests/auto/declarative/visual/colorAnimation/image0.pngbin0 -> 947 bytes
-rw-r--r--tests/auto/declarative/visual/colorAnimation/manifest-play.xml73
-rw-r--r--tests/auto/declarative/visual/colorAnimation/manifest.xml73
-rw-r--r--tests/auto/declarative/visual/easing/easing.xml70
-rw-r--r--tests/auto/declarative/visual/easing/image0.pngbin0 -> 17530 bytes
-rw-r--r--tests/auto/declarative/visual/easing/manifest-play.xml23
-rw-r--r--tests/auto/declarative/visual/easing/manifest.xml23
-rw-r--r--tests/auto/declarative/visual/easing/pics/qtlogo.pngbin0 -> 2738 bytes
-rw-r--r--tests/auto/declarative/visual/flickable/Day.qml8
-rw-r--r--tests/auto/declarative/visual/flickable/cork.jpgbin0 -> 88766 bytes
-rw-r--r--tests/auto/declarative/visual/flickable/flickable.xml43
-rw-r--r--tests/auto/declarative/visual/flickable/image0.pngbin0 -> 360547 bytes
-rw-r--r--tests/auto/declarative/visual/flickable/manifest-fail.xml30
-rw-r--r--tests/auto/declarative/visual/flickable/manifest.xml190
-rw-r--r--tests/auto/declarative/visual/flipable/flipable.xml138
-rw-r--r--tests/auto/declarative/visual/flipable/image0.pngbin0 -> 6184 bytes
-rw-r--r--tests/auto/declarative/visual/flipable/manifest-play.xml24
-rw-r--r--tests/auto/declarative/visual/flipable/manifest.xml24
-rw-r--r--tests/auto/declarative/visual/flipable/pics/arrow.pngbin0 -> 546 bytes
-rw-r--r--tests/auto/declarative/visual/flipable/pics/face.pngbin0 -> 10112 bytes
-rw-r--r--tests/auto/declarative/visual/flipable/pics/photo0.pngbin0 -> 10412 bytes
-rw-r--r--tests/auto/declarative/visual/flipable/pics/photo1.pngbin0 -> 11068 bytes
-rw-r--r--tests/auto/declarative/visual/flipable/pics/photo10.pngbin0 -> 12539 bytes
-rw-r--r--tests/auto/declarative/visual/flipable/pics/photo2.pngbin0 -> 11490 bytes
-rw-r--r--tests/auto/declarative/visual/flipable/pics/photo3.pngbin0 -> 11308 bytes
-rw-r--r--tests/auto/declarative/visual/flipable/pics/photo4.pngbin0 -> 11322 bytes
-rw-r--r--tests/auto/declarative/visual/flipable/pics/photo5.pngbin0 -> 11497 bytes
-rw-r--r--tests/auto/declarative/visual/flipable/pics/photo6.pngbin0 -> 11707 bytes
-rw-r--r--tests/auto/declarative/visual/flipable/pics/photo7.pngbin0 -> 11101 bytes
-rw-r--r--tests/auto/declarative/visual/flipable/pics/photo8.pngbin0 -> 11558 bytes
-rw-r--r--tests/auto/declarative/visual/flipable/pics/photo9.pngbin0 -> 10943 bytes
-rw-r--r--tests/auto/declarative/visual/pauseAnimation/image0.pngbin0 -> 3209 bytes
-rw-r--r--tests/auto/declarative/visual/pauseAnimation/manifest-play.xml138
-rw-r--r--tests/auto/declarative/visual/pauseAnimation/manifest.xml138
-rw-r--r--tests/auto/declarative/visual/pauseAnimation/pauseAnimation.xml13
-rw-r--r--tests/auto/declarative/visual/pauseAnimation/pics/qtlogo.pngbin0 -> 2738 bytes
-rw-r--r--tests/auto/declarative/visual/qfxtext/elide/data/opengl/image0.pngbin0 -> 980 bytes
-rw-r--r--tests/auto/declarative/visual/qfxtext/elide/data/opengl/manifest.xml4
-rw-r--r--tests/auto/declarative/visual/qfxtext/elide/elide.xml6
-rw-r--r--tests/auto/declarative/visual/qfxtext/elide/test1
-rw-r--r--tests/auto/declarative/visual/repeater/basic1/basic1.xml21
-rw-r--r--tests/auto/declarative/visual/repeater/basic1/data/opengl/image0.pngbin0 -> 3493 bytes
-rw-r--r--tests/auto/declarative/visual/repeater/basic1/data/opengl/manifest.xml4
-rw-r--r--tests/auto/declarative/visual/repeater/basic1/test1
-rw-r--r--tests/auto/declarative/visual/repeater/basic2/basic2.xml22
-rw-r--r--tests/auto/declarative/visual/repeater/basic2/data/opengl/image0.pngbin0 -> 3493 bytes
-rw-r--r--tests/auto/declarative/visual/repeater/basic2/data/opengl/manifest.xml4
-rw-r--r--tests/auto/declarative/visual/repeater/basic2/test1
-rw-r--r--tests/auto/declarative/visual/repeater/basic3/basic3.xml19
-rw-r--r--tests/auto/declarative/visual/repeater/basic3/data/opengl/image0.pngbin0 -> 3493 bytes
-rw-r--r--tests/auto/declarative/visual/repeater/basic3/data/opengl/manifest.xml4
-rw-r--r--tests/auto/declarative/visual/repeater/basic3/test1
-rw-r--r--tests/auto/declarative/visual/repeater/basic4/basic4.xml18
-rw-r--r--tests/auto/declarative/visual/repeater/basic4/data/opengl/image0.pngbin0 -> 3493 bytes
-rw-r--r--tests/auto/declarative/visual/repeater/basic4/data/opengl/manifest.xml4
-rw-r--r--tests/auto/declarative/visual/repeater/basic4/test1
-rwxr-xr-xtests/auto/declarative/visual/runtests.sh2
-rw-r--r--tests/auto/declarative/visual/tests11
-rw-r--r--tests/auto/declarative/visual/tst_visual.cpp72
-rw-r--r--tests/auto/declarative/visual/visual.pro5
-rw-r--r--tests/auto/declarative/visual/webview/autosize/data/opengl/image0.pngbin0 -> 5396 bytes
-rw-r--r--tests/auto/declarative/visual/webview/autosize/data/opengl/manifest.xml4
-rw-r--r--tests/auto/declarative/visual/webview/autosize/test1
136 files changed, 5072 insertions, 0 deletions
diff --git a/tests/auto/declarative/.gitignore b/tests/auto/declarative/.gitignore
new file mode 100644
index 0000000..c8bbd2f
--- /dev/null
+++ b/tests/auto/declarative/.gitignore
@@ -0,0 +1,3 @@
+tst_*
+!tst_*.*
+tst_*~
diff --git a/tests/auto/declarative/datetimeformatter/datetimeformatter.pro b/tests/auto/declarative/datetimeformatter/datetimeformatter.pro
new file mode 100644
index 0000000..e3d6cd0
--- /dev/null
+++ b/tests/auto/declarative/datetimeformatter/datetimeformatter.pro
@@ -0,0 +1,3 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_datetimeformatter.cpp
diff --git a/tests/auto/declarative/datetimeformatter/tst_datetimeformatter.cpp b/tests/auto/declarative/datetimeformatter/tst_datetimeformatter.cpp
new file mode 100644
index 0000000..4593033
--- /dev/null
+++ b/tests/auto/declarative/datetimeformatter/tst_datetimeformatter.cpp
@@ -0,0 +1,83 @@
+#include <qtest.h>
+#include <QtDeclarative/qmlengine.h>
+#include <QtDeclarative/qmlcomponent.h>
+#include <QtDeclarative/qmldatetimeformatter.h>
+
+class tst_datetimeformatter : public QObject
+{
+ Q_OBJECT
+public:
+ tst_datetimeformatter() {}
+
+private slots:
+ void date();
+ void time();
+ void dateTime();
+};
+
+void tst_datetimeformatter::date()
+{
+ QmlEngine engine;
+ QmlComponent formatterComponent(&engine, "<DateTimeFormatter date=\"2008-12-24\"/>");
+ QmlDateTimeFormatter *formatter = qobject_cast<QmlDateTimeFormatter*>(formatterComponent.create());
+ QVERIFY(formatter != 0);
+
+ QDate date(2008,12,24);
+ QCOMPARE(formatter->dateText(),date.toString(Qt::SystemLocaleShortDate));
+
+ formatter->setLongStyle(true);
+ QCOMPARE(formatter->dateText(),date.toString(Qt::SystemLocaleLongDate));
+
+ formatter->setDateFormat("ddd MMMM d yy");
+ QCOMPARE(formatter->dateText(),date.toString("ddd MMMM d yy"));
+
+ QVERIFY(formatter->timeText().isEmpty());
+ QVERIFY(formatter->dateTimeText().isEmpty());
+}
+
+void tst_datetimeformatter::time()
+{
+ QmlEngine engine;
+ QmlComponent formatterComponent(&engine, "<DateTimeFormatter time=\"14:15:38.200\"/>");
+ QmlDateTimeFormatter *formatter = qobject_cast<QmlDateTimeFormatter*>(formatterComponent.create());
+ QVERIFY(formatter != 0);
+
+ QTime time(14,15,38,200);
+
+ QCOMPARE(formatter->time(),time);
+
+ QCOMPARE(formatter->timeText(),time.toString(Qt::SystemLocaleShortDate));
+
+ formatter->setLongStyle(true);
+ QCOMPARE(formatter->timeText(),time.toString(Qt::SystemLocaleLongDate));
+
+ formatter->setTimeFormat("H:m:s a");
+ QCOMPARE(formatter->timeText(),time.toString("H:m:s a"));
+
+ formatter->setTimeFormat("hh:mm:ss.zzz");
+ QCOMPARE(formatter->timeText(),time.toString("hh:mm:ss.zzz"));
+
+ QVERIFY(formatter->dateText().isEmpty());
+ QVERIFY(formatter->dateTimeText().isEmpty());
+}
+
+void tst_datetimeformatter::dateTime()
+{
+ QmlEngine engine;
+ QmlComponent formatterComponent(&engine, "<DateTimeFormatter dateTime=\"1978-03-04T09:13:54\"/>");
+ QmlDateTimeFormatter *formatter = qobject_cast<QmlDateTimeFormatter*>(formatterComponent.create());
+ QVERIFY(formatter != 0);
+
+ QDateTime dateTime(QDate(1978,03,04),QTime(9,13,54));
+ QCOMPARE(formatter->dateTimeText(),dateTime.toString(Qt::SystemLocaleShortDate));
+
+ formatter->setLongStyle(true);
+ QCOMPARE(formatter->dateTimeText(),dateTime.toString(Qt::SystemLocaleLongDate));
+
+ formatter->setDateTimeFormat("M/d/yy H:m:s a");
+ QCOMPARE(formatter->dateTimeText(),dateTime.toString("M/d/yy H:m:s a"));
+}
+
+QTEST_MAIN(tst_datetimeformatter)
+
+#include "tst_datetimeformatter.moc"
diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro
new file mode 100644
index 0000000..b6e3584
--- /dev/null
+++ b/tests/auto/declarative/declarative.pro
@@ -0,0 +1,22 @@
+TEMPLATE = subdirs
+SUBDIRS += datetimeformatter \
+ numberformatter \
+ qbindablemap \
+ layouts \
+ listview \
+ pathview \
+ qfxtext \
+ qfxtextedit \
+ simplecanvasitem \
+ repeater \
+ qmlparser \
+ qmlbindengine \
+ qmlmetaproperty \
+ qmllist \
+ qmllistaccessor \
+ visual
+
+# Tests which should run in Pulse
+PULSE_TESTS = $$SUBDIRS
+PULSE_TESTS -= visual # All except 'visual' tests, allegedly too flaky
+
diff --git a/tests/auto/declarative/layouts/data/grid-margin.xml b/tests/auto/declarative/layouts/data/grid-margin.xml
new file mode 100644
index 0000000..fe58eef
--- /dev/null
+++ b/tests/auto/declarative/layouts/data/grid-margin.xml
@@ -0,0 +1,9 @@
+<Item width="640" height="480">
+ <GridLayout columns="3" margin="8">
+ <Rect id="one" color="red" width="50" height="50"/>
+ <Rect id="two" color="green" width="20" height="50"/>
+ <Rect id="three" color="blue" width="50" height="20"/>
+ <Rect id="four" color="cyan" width="50" height="50"/>
+ <Rect id="five" color="magenta" width="10" height="10"/>
+ </GridLayout>
+</Item>
diff --git a/tests/auto/declarative/layouts/data/grid-spacing-margin.xml b/tests/auto/declarative/layouts/data/grid-spacing-margin.xml
new file mode 100644
index 0000000..807b653
--- /dev/null
+++ b/tests/auto/declarative/layouts/data/grid-spacing-margin.xml
@@ -0,0 +1,9 @@
+<Item width="640" height="480">
+ <GridLayout columns="3" spacing="4" margin="8">
+ <Rect id="one" color="red" width="50" height="50"/>
+ <Rect id="two" color="green" width="20" height="50"/>
+ <Rect id="three" color="blue" width="50" height="20"/>
+ <Rect id="four" color="cyan" width="50" height="50"/>
+ <Rect id="five" color="magenta" width="10" height="10"/>
+ </GridLayout>
+</Item>
diff --git a/tests/auto/declarative/layouts/data/grid-spacing.xml b/tests/auto/declarative/layouts/data/grid-spacing.xml
new file mode 100644
index 0000000..55ef5a5
--- /dev/null
+++ b/tests/auto/declarative/layouts/data/grid-spacing.xml
@@ -0,0 +1,9 @@
+<Item width="640" height="480">
+ <GridLayout columns="3" spacing="4">
+ <Rect id="one" color="red" width="50" height="50"/>
+ <Rect id="two" color="green" width="20" height="50"/>
+ <Rect id="three" color="blue" width="50" height="20"/>
+ <Rect id="four" color="cyan" width="50" height="50"/>
+ <Rect id="five" color="magenta" width="10" height="10"/>
+ </GridLayout>
+</Item>
diff --git a/tests/auto/declarative/layouts/data/grid.xml b/tests/auto/declarative/layouts/data/grid.xml
new file mode 100644
index 0000000..abef813
--- /dev/null
+++ b/tests/auto/declarative/layouts/data/grid.xml
@@ -0,0 +1,9 @@
+<Item width="640" height="480">
+ <GridLayout columns="3">
+ <Rect id="one" color="red" width="50" height="50"/>
+ <Rect id="two" color="green" width="20" height="50"/>
+ <Rect id="three" color="blue" width="50" height="20"/>
+ <Rect id="four" color="cyan" width="50" height="50"/>
+ <Rect id="five" color="magenta" width="10" height="10"/>
+ </GridLayout>
+</Item>
diff --git a/tests/auto/declarative/layouts/data/horizontal-margin.xml b/tests/auto/declarative/layouts/data/horizontal-margin.xml
new file mode 100644
index 0000000..7ee9706
--- /dev/null
+++ b/tests/auto/declarative/layouts/data/horizontal-margin.xml
@@ -0,0 +1,7 @@
+<Item width="640" height="480">
+ <HorizontalLayout margin="10">
+ <Rect id="one" color="red" width="50" height="50"/>
+ <Rect id="two" color="red" width="20" height="10"/>
+ <Rect id="three" color="red" width="40" height="20"/>
+ </HorizontalLayout>
+</Item>
diff --git a/tests/auto/declarative/layouts/data/horizontal-spacing-margin.xml b/tests/auto/declarative/layouts/data/horizontal-spacing-margin.xml
new file mode 100644
index 0000000..8767818
--- /dev/null
+++ b/tests/auto/declarative/layouts/data/horizontal-spacing-margin.xml
@@ -0,0 +1,7 @@
+<Item width="640" height="480">
+ <HorizontalLayout spacing="5" margin="10">
+ <Rect id="one" color="red" width="50" height="50"/>
+ <Rect id="two" color="red" width="20" height="10"/>
+ <Rect id="three" color="red" width="40" height="20"/>
+ </HorizontalLayout>
+</Item>
diff --git a/tests/auto/declarative/layouts/data/horizontal-spacing.xml b/tests/auto/declarative/layouts/data/horizontal-spacing.xml
new file mode 100644
index 0000000..cb58711
--- /dev/null
+++ b/tests/auto/declarative/layouts/data/horizontal-spacing.xml
@@ -0,0 +1,7 @@
+<Item width="640" height="480">
+ <HorizontalLayout spacing="10">
+ <Rect id="one" color="red" width="50" height="50"/>
+ <Rect id="two" color="red" width="20" height="10"/>
+ <Rect id="three" color="red" width="40" height="20"/>
+ </HorizontalLayout>
+</Item>
diff --git a/tests/auto/declarative/layouts/data/horizontal.xml b/tests/auto/declarative/layouts/data/horizontal.xml
new file mode 100644
index 0000000..f9deaf1
--- /dev/null
+++ b/tests/auto/declarative/layouts/data/horizontal.xml
@@ -0,0 +1,7 @@
+<Item width="640" height="480">
+ <HorizontalLayout>
+ <Rect id="one" color="red" width="50" height="50"/>
+ <Rect id="two" color="red" width="20" height="10"/>
+ <Rect id="three" color="red" width="40" height="20"/>
+ </HorizontalLayout>
+</Item>
diff --git a/tests/auto/declarative/layouts/data/vertical-margin.xml b/tests/auto/declarative/layouts/data/vertical-margin.xml
new file mode 100644
index 0000000..abd7635
--- /dev/null
+++ b/tests/auto/declarative/layouts/data/vertical-margin.xml
@@ -0,0 +1,7 @@
+<Item width="640" height="480">
+ <VerticalLayout margin="10">
+ <Rect id="one" color="red" width="50" height="50"/>
+ <Rect id="two" color="red" width="20" height="10"/>
+ <Rect id="three" color="red" width="40" height="20"/>
+ </VerticalLayout>
+</Item>
diff --git a/tests/auto/declarative/layouts/data/vertical-spacing-margin.xml b/tests/auto/declarative/layouts/data/vertical-spacing-margin.xml
new file mode 100644
index 0000000..3d41ca0
--- /dev/null
+++ b/tests/auto/declarative/layouts/data/vertical-spacing-margin.xml
@@ -0,0 +1,7 @@
+<Item width="640" height="480">
+ <VerticalLayout spacing="5" margin="10">
+ <Rect id="one" color="red" width="50" height="50"/>
+ <Rect id="two" color="red" width="20" height="10"/>
+ <Rect id="three" color="red" width="40" height="20"/>
+ </VerticalLayout>
+</Item>
diff --git a/tests/auto/declarative/layouts/data/vertical-spacing.xml b/tests/auto/declarative/layouts/data/vertical-spacing.xml
new file mode 100644
index 0000000..e25f981
--- /dev/null
+++ b/tests/auto/declarative/layouts/data/vertical-spacing.xml
@@ -0,0 +1,7 @@
+<Item width="640" height="480">
+ <VerticalLayout spacing="10">
+ <Rect id="one" color="red" width="50" height="50"/>
+ <Rect id="two" color="red" width="20" height="10"/>
+ <Rect id="three" color="red" width="40" height="20"/>
+ </VerticalLayout>
+</Item>
diff --git a/tests/auto/declarative/layouts/data/vertical.xml b/tests/auto/declarative/layouts/data/vertical.xml
new file mode 100644
index 0000000..198d99f
--- /dev/null
+++ b/tests/auto/declarative/layouts/data/vertical.xml
@@ -0,0 +1,7 @@
+<Item width="640" height="480">
+ <VerticalLayout>
+ <Rect id="one" color="red" width="50" height="50"/>
+ <Rect id="two" color="red" width="20" height="10"/>
+ <Rect id="three" color="red" width="40" height="20"/>
+ </VerticalLayout>
+</Item>
diff --git a/tests/auto/declarative/layouts/layouts.pro b/tests/auto/declarative/layouts/layouts.pro
new file mode 100644
index 0000000..f7e7622
--- /dev/null
+++ b/tests/auto/declarative/layouts/layouts.pro
@@ -0,0 +1,6 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_layouts.cpp
+
+# Define SRCDIR equal to test's source directory
+DEFINES += SRCDIR=\\\"$$PWD\\\"
diff --git a/tests/auto/declarative/layouts/tst_layouts.cpp b/tests/auto/declarative/layouts/tst_layouts.cpp
new file mode 100644
index 0000000..ad6a0b2
--- /dev/null
+++ b/tests/auto/declarative/layouts/tst_layouts.cpp
@@ -0,0 +1,392 @@
+#include <QtTest/QtTest>
+#include <qlistmodelinterface.h>
+#include <qfxview.h>
+#include <qfxrect.h>
+#include <qmlexpression.h>
+
+class tst_QFxLayouts : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QFxLayouts();
+
+private slots:
+ void test_horizontal();
+ void test_horizontal_spacing();
+ void test_horizontal_margin();
+ void test_horizontal_spacing_margin();
+ void test_vertical();
+ void test_vertical_spacing();
+ void test_vertical_margin();
+ void test_vertical_spacing_margin();
+ void test_grid();
+ void test_grid_spacing();
+ void test_grid_margin();
+ void test_grid_spacing_margin();
+
+private:
+ QFxView *createView(const QString &filename);
+ template<typename T>
+ T *findItem(QFxItem *parent, const QString &id, int index=0);
+};
+
+tst_QFxLayouts::tst_QFxLayouts()
+{
+}
+
+void tst_QFxLayouts::test_horizontal()
+{
+ QFxView *canvas = createView(SRCDIR "/data/horizontal.xml");
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxRect *one = findItem<QFxRect>(canvas->root(), "one");
+ QVERIFY(one != 0);
+
+ QFxRect *two = findItem<QFxRect>(canvas->root(), "two");
+ QVERIFY(two != 0);
+
+ QFxRect *three = findItem<QFxRect>(canvas->root(), "three");
+ QVERIFY(three != 0);
+
+ QCOMPARE(one->x(), 0.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 50.0);
+ QCOMPARE(two->y(), 0.0);
+ QCOMPARE(three->x(), 70.0);
+ QCOMPARE(three->y(), 0.0);
+}
+
+void tst_QFxLayouts::test_horizontal_spacing()
+{
+ QFxView *canvas = createView(SRCDIR "/data/horizontal-spacing.xml");
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxRect *one = findItem<QFxRect>(canvas->root(), "one");
+ QVERIFY(one != 0);
+
+ QFxRect *two = findItem<QFxRect>(canvas->root(), "two");
+ QVERIFY(two != 0);
+
+ QFxRect *three = findItem<QFxRect>(canvas->root(), "three");
+ QVERIFY(three != 0);
+
+ QCOMPARE(one->x(), 0.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 60.0);
+ QCOMPARE(two->y(), 0.0);
+ QCOMPARE(three->x(), 90.0);
+ QCOMPARE(three->y(), 0.0);
+}
+
+void tst_QFxLayouts::test_horizontal_margin()
+{
+ QFxView *canvas = createView(SRCDIR "/data/horizontal-margin.xml");
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxRect *one = findItem<QFxRect>(canvas->root(), "one");
+ QVERIFY(one != 0);
+
+ QFxRect *two = findItem<QFxRect>(canvas->root(), "two");
+ QVERIFY(two != 0);
+
+ QFxRect *three = findItem<QFxRect>(canvas->root(), "three");
+ QVERIFY(three != 0);
+
+ QCOMPARE(one->x(), 10.0);
+ QCOMPARE(one->y(), 10.0);
+ QCOMPARE(two->x(), 60.0);
+ QCOMPARE(two->y(), 10.0);
+ QCOMPARE(three->x(), 80.0);
+ QCOMPARE(three->y(), 10.0);
+}
+
+void tst_QFxLayouts::test_horizontal_spacing_margin()
+{
+ QFxView *canvas = createView(SRCDIR "/data/horizontal-spacing-margin.xml");
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxRect *one = findItem<QFxRect>(canvas->root(), "one");
+ QVERIFY(one != 0);
+
+ QFxRect *two = findItem<QFxRect>(canvas->root(), "two");
+ QVERIFY(two != 0);
+
+ QFxRect *three = findItem<QFxRect>(canvas->root(), "three");
+ QVERIFY(three != 0);
+
+ QCOMPARE(one->x(), 10.0);
+ QCOMPARE(one->y(), 10.0);
+ QCOMPARE(two->x(), 65.0);
+ QCOMPARE(two->y(), 10.0);
+ QCOMPARE(three->x(), 90.0);
+ QCOMPARE(three->y(), 10.0);
+}
+
+void tst_QFxLayouts::test_vertical()
+{
+ QFxView *canvas = createView(SRCDIR "/data/vertical.xml");
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxRect *one = findItem<QFxRect>(canvas->root(), "one");
+ QVERIFY(one != 0);
+
+ QFxRect *two = findItem<QFxRect>(canvas->root(), "two");
+ QVERIFY(two != 0);
+
+ QFxRect *three = findItem<QFxRect>(canvas->root(), "three");
+ QVERIFY(three != 0);
+
+ QCOMPARE(one->x(), 0.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 0.0);
+ QCOMPARE(two->y(), 50.0);
+ QCOMPARE(three->x(), 0.0);
+ QCOMPARE(three->y(), 60.0);
+}
+
+void tst_QFxLayouts::test_vertical_spacing()
+{
+ QFxView *canvas = createView(SRCDIR "/data/vertical-spacing.xml");
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxRect *one = findItem<QFxRect>(canvas->root(), "one");
+ QVERIFY(one != 0);
+
+ QFxRect *two = findItem<QFxRect>(canvas->root(), "two");
+ QVERIFY(two != 0);
+
+ QFxRect *three = findItem<QFxRect>(canvas->root(), "three");
+ QVERIFY(three != 0);
+
+ QCOMPARE(one->x(), 0.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 0.0);
+ QCOMPARE(two->y(), 60.0);
+ QCOMPARE(three->x(), 0.0);
+ QCOMPARE(three->y(), 80.0);
+}
+
+void tst_QFxLayouts::test_vertical_margin()
+{
+ QFxView *canvas = createView(SRCDIR "/data/vertical-margin.xml");
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxRect *one = findItem<QFxRect>(canvas->root(), "one");
+ QVERIFY(one != 0);
+
+ QFxRect *two = findItem<QFxRect>(canvas->root(), "two");
+ QVERIFY(two != 0);
+
+ QFxRect *three = findItem<QFxRect>(canvas->root(), "three");
+ QVERIFY(three != 0);
+
+ QCOMPARE(one->x(), 10.0);
+ QCOMPARE(one->y(), 10.0);
+ QCOMPARE(two->x(), 10.0);
+ QCOMPARE(two->y(), 60.0);
+ QCOMPARE(three->x(), 10.0);
+ QCOMPARE(three->y(), 70.0);
+}
+
+void tst_QFxLayouts::test_vertical_spacing_margin()
+{
+ QFxView *canvas = createView(SRCDIR "/data/vertical-spacing-margin.xml");
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxRect *one = findItem<QFxRect>(canvas->root(), "one");
+ QVERIFY(one != 0);
+
+ QFxRect *two = findItem<QFxRect>(canvas->root(), "two");
+ QVERIFY(two != 0);
+
+ QFxRect *three = findItem<QFxRect>(canvas->root(), "three");
+ QVERIFY(three != 0);
+
+ QCOMPARE(one->x(), 10.0);
+ QCOMPARE(one->y(), 10.0);
+ QCOMPARE(two->x(), 10.0);
+ QCOMPARE(two->y(), 65.0);
+ QCOMPARE(three->x(), 10.0);
+ QCOMPARE(three->y(), 80.0);
+}
+
+void tst_QFxLayouts::test_grid()
+{
+ QFxView *canvas = createView("data/grid.xml");
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxRect *one = findItem<QFxRect>(canvas->root(), "one");
+ QVERIFY(one != 0);
+ QFxRect *two = findItem<QFxRect>(canvas->root(), "two");
+ QVERIFY(two != 0);
+ QFxRect *three = findItem<QFxRect>(canvas->root(), "three");
+ QVERIFY(three != 0);
+ QFxRect *four = findItem<QFxRect>(canvas->root(), "four");
+ QVERIFY(four != 0);
+ QFxRect *five = findItem<QFxRect>(canvas->root(), "five");
+ QVERIFY(five != 0);
+
+ QCOMPARE(one->x(), 0.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 50.0);
+ QCOMPARE(two->y(), 0.0);
+ QCOMPARE(three->x(), 70.0);
+ QCOMPARE(three->y(), 0.0);
+ QCOMPARE(four->x(), 0.0);
+ QCOMPARE(four->y(), 50.0);
+ QCOMPARE(five->x(), 50.0);
+ QCOMPARE(five->y(), 50.0);
+}
+
+void tst_QFxLayouts::test_grid_spacing()
+{
+ QFxView *canvas = createView("data/grid-spacing.xml");
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxRect *one = findItem<QFxRect>(canvas->root(), "one");
+ QVERIFY(one != 0);
+ QFxRect *two = findItem<QFxRect>(canvas->root(), "two");
+ QVERIFY(two != 0);
+ QFxRect *three = findItem<QFxRect>(canvas->root(), "three");
+ QVERIFY(three != 0);
+ QFxRect *four = findItem<QFxRect>(canvas->root(), "four");
+ QVERIFY(four != 0);
+ QFxRect *five = findItem<QFxRect>(canvas->root(), "five");
+ QVERIFY(five != 0);
+
+ QCOMPARE(one->x(), 0.0);
+ QCOMPARE(one->y(), 0.0);
+ QCOMPARE(two->x(), 54.0);
+ QCOMPARE(two->y(), 0.0);
+ QCOMPARE(three->x(), 78.0);
+ QCOMPARE(three->y(), 0.0);
+ QCOMPARE(four->x(), 0.0);
+ QCOMPARE(four->y(), 54.0);
+ QCOMPARE(five->x(), 54.0);
+ QCOMPARE(five->y(), 54.0);
+}
+
+void tst_QFxLayouts::test_grid_margin()
+{
+ QFxView *canvas = createView("data/grid-margin.xml");
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxRect *one = findItem<QFxRect>(canvas->root(), "one");
+ QVERIFY(one != 0);
+ QFxRect *two = findItem<QFxRect>(canvas->root(), "two");
+ QVERIFY(two != 0);
+ QFxRect *three = findItem<QFxRect>(canvas->root(), "three");
+ QVERIFY(three != 0);
+ QFxRect *four = findItem<QFxRect>(canvas->root(), "four");
+ QVERIFY(four != 0);
+ QFxRect *five = findItem<QFxRect>(canvas->root(), "five");
+ QVERIFY(five != 0);
+
+ QCOMPARE(one->x(), 8.0);
+ QCOMPARE(one->y(), 8.0);
+ QCOMPARE(two->x(), 58.0);
+ QCOMPARE(two->y(), 8.0);
+ QCOMPARE(three->x(), 78.0);
+ QCOMPARE(three->y(), 8.0);
+ QCOMPARE(four->x(), 8.0);
+ QCOMPARE(four->y(), 58.0);
+ QCOMPARE(five->x(), 58.0);
+ QCOMPARE(five->y(), 58.0);
+}
+
+
+void tst_QFxLayouts::test_grid_spacing_margin()
+{
+ QFxView *canvas = createView("data/grid-spacing-margin.xml");
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxRect *one = findItem<QFxRect>(canvas->root(), "one");
+ QVERIFY(one != 0);
+ QFxRect *two = findItem<QFxRect>(canvas->root(), "two");
+ QVERIFY(two != 0);
+ QFxRect *three = findItem<QFxRect>(canvas->root(), "three");
+ QVERIFY(three != 0);
+ QFxRect *four = findItem<QFxRect>(canvas->root(), "four");
+ QVERIFY(four != 0);
+ QFxRect *five = findItem<QFxRect>(canvas->root(), "five");
+ QVERIFY(five != 0);
+
+ QCOMPARE(one->x(), 8.0);
+ QCOMPARE(one->y(), 8.0);
+ QCOMPARE(two->x(), 62.0);
+ QCOMPARE(two->y(), 8.0);
+ QCOMPARE(three->x(), 86.0);
+ QCOMPARE(three->y(), 8.0);
+ QCOMPARE(four->x(), 8.0);
+ QCOMPARE(four->y(), 62.0);
+ QCOMPARE(five->x(), 62.0);
+ QCOMPARE(five->y(), 62.0);
+}
+
+QFxView *tst_QFxLayouts::createView(const QString &filename)
+{
+ QFxView *canvas = new QFxView(0);
+
+ QFile file(filename);
+ file.open(QFile::ReadOnly);
+ QString xml = file.readAll();
+ canvas->setXml(xml, filename);
+
+ return canvas;
+}
+
+/*
+ Find an item with the specified id. If index is supplied then the
+ item must also evaluate the {index} expression equal to index
+*/
+template<typename T>
+T *tst_QFxLayouts::findItem(QFxItem *parent, const QString &id, int index)
+{
+ const QMetaObject &mo = T::staticMetaObject;
+ for (int i = 0; i < parent->children()->count(); ++i) {
+ QFxItem *item = parent->children()->at(i);
+ if (mo.cast(item) && (id.isEmpty() || item->id() == id)) {
+ if (index != -1) {
+ QmlExpression e(item->itemContext(), "index", item);
+ e.setTrackChange(false);
+ if (e.value().toInt() == index)
+ return static_cast<T*>(item);
+ } else {
+ return static_cast<T*>(item);
+ }
+ }
+ item = findItem<T>(item, id, index);
+ if (item)
+ return static_cast<T*>(item);
+ }
+
+ return 0;
+}
+
+QTEST_MAIN(tst_QFxLayouts)
+
+#include "tst_layouts.moc"
diff --git a/tests/auto/declarative/listview/data/listview.xml b/tests/auto/declarative/listview/data/listview.xml
new file mode 100644
index 0000000..7fda2b5
--- /dev/null
+++ b/tests/auto/declarative/listview/data/listview.xml
@@ -0,0 +1,14 @@
+<Rect width="240" height="320" color="#ffffff">
+ <resources>
+ <Component id="Delegate">
+ <Item id="wrapper" height="20" width="240">
+ <Text text="{index}"/>
+ <Text x="30" id="textName" text="{name}"/>
+ <Text x="120" id="textNumber" text="{number}"/>
+ <Text x="200" text="{wrapper.y}"/>
+ </Item>
+ </Component>
+ </resources>
+ <ListView id="list" width="240" height="320" model="{testModel}" delegate="{Delegate}">
+ </ListView>
+</Rect>
diff --git a/tests/auto/declarative/listview/listview.pro b/tests/auto/declarative/listview/listview.pro
new file mode 100644
index 0000000..bf68268
--- /dev/null
+++ b/tests/auto/declarative/listview/listview.pro
@@ -0,0 +1,6 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_listview.cpp
+
+# Define SRCDIR equal to test's source directory
+DEFINES += SRCDIR=\\\"$$PWD\\\"
diff --git a/tests/auto/declarative/listview/tst_listview.cpp b/tests/auto/declarative/listview/tst_listview.cpp
new file mode 100644
index 0000000..5dd94a2
--- /dev/null
+++ b/tests/auto/declarative/listview/tst_listview.cpp
@@ -0,0 +1,484 @@
+#include <QtTest/QtTest>
+#include <qlistmodelinterface.h>
+#include <qfxview.h>
+#include <qfxlistview.h>
+#include <qfxtext.h>
+#include <qmlcontext.h>
+#include <qmlexpression.h>
+
+class tst_QFxListView : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QFxListView();
+
+private slots:
+ // Test both QListModelInterface and QAbstractItemModel model types
+ void qListModelInterface_items();
+ void qAbstractItemModel_items();
+
+ void qListModelInterface_changed();
+ void qAbstractItemModel_changed();
+
+ void qListModelInterface_inserted();
+ void qAbstractItemModel_inserted();
+
+ void qListModelInterface_removed();
+ void qAbstractItemModel_removed();
+
+private:
+ template <class T> void items();
+ template <class T> void changed();
+ template <class T> void inserted();
+ template <class T> void removed();
+ QFxView *createView(const QString &filename);
+ template<typename T>
+ T *findItem(QFxItem *parent, const QString &id, int index=0);
+};
+
+class TestModel : public QListModelInterface
+{
+ Q_OBJECT
+public:
+ TestModel(QObject *parent = 0) : QListModelInterface(parent) {}
+ ~TestModel() {}
+
+ enum Roles { Name, Number };
+
+ QString name(int index) const { return list.at(index).first; }
+ QString number(int index) const { return list.at(index).second; }
+
+ int count() const { return list.count(); }
+
+ QList<int> roles() const { return QList<int>() << Name << Number; }
+ QString toString(int role) const {
+ switch(role) {
+ case Name:
+ return "name";
+ case Number:
+ return "number";
+ default:
+ return "";
+ }
+ }
+
+ QHash<int, QVariant> data(int index, const QList<int> &roles) const {
+ QHash<int,QVariant> returnHash;
+
+ for (int i = 0; i < roles.size(); ++i) {
+ int role = roles.at(i);
+ QVariant info;
+ switch(role) {
+ case Name:
+ info = list.at(index).first;
+ break;
+ case Number:
+ info = list.at(index).second;
+ break;
+ default:
+ break;
+ }
+ returnHash.insert(role, info);
+ }
+ return returnHash;
+ }
+
+ void addItem(const QString &name, const QString &number) {
+ list.append(QPair<QString,QString>(name, number));
+ emit itemsInserted(list.count()-1, 1);
+ }
+
+ void insertItem(int index, const QString &name, const QString &number) {
+ list.insert(index, QPair<QString,QString>(name, number));
+ emit itemsInserted(index, 1);
+ }
+
+ void removeItem(int index) {
+ list.removeAt(index);
+ emit itemsRemoved(index, 1);
+ }
+
+ void modifyItem(int index, const QString &name, const QString &number) {
+ list[index] = QPair<QString,QString>(name, number);
+ emit itemsChanged(index, 1, roles());
+ }
+
+private:
+ QList<QPair<QString,QString> > list;
+};
+
+
+class TestModel2 : public QAbstractListModel
+{
+public:
+ enum Roles { Name = Qt::UserRole+1, Number = Qt::UserRole+2 };
+
+ TestModel2(QObject *parent=0) : QAbstractListModel(parent) {
+ QHash<int, QByteArray> roles;
+ roles[Name] = "name";
+ roles[Number] = "number";
+ setRoleNames(roles);
+ }
+
+ int rowCount(const QModelIndex &parent=QModelIndex()) const { return list.count(); }
+ QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const {
+ QVariant rv;
+ if (role == Name)
+ rv = list.at(index.row()).first;
+ else if (role == Number)
+ rv = list.at(index.row()).second;
+
+ return rv;
+ }
+
+ int count() const { return rowCount(); }
+ QString name(int index) const { return list.at(index).first; }
+ QString number(int index) const { return list.at(index).second; }
+
+ void addItem(const QString &name, const QString &number) {
+ emit beginInsertRows(QModelIndex(), list.count(), list.count());
+ list.append(QPair<QString,QString>(name, number));
+ emit endInsertRows();
+ }
+
+ void insertItem(int index, const QString &name, const QString &number) {
+ emit beginInsertRows(QModelIndex(), index, index);
+ list.insert(index, QPair<QString,QString>(name, number));
+ emit endInsertRows();
+ }
+
+ void removeItem(int index) {
+ emit beginRemoveRows(QModelIndex(), index, index);
+ list.removeAt(index);
+ emit endRemoveRows();
+ }
+
+ void modifyItem(int idx, const QString &name, const QString &number) {
+ list[idx] = QPair<QString,QString>(name, number);
+ emit dataChanged(index(idx,0), index(idx,0));
+ }
+
+private:
+ QList<QPair<QString,QString> > list;
+};
+
+tst_QFxListView::tst_QFxListView()
+{
+}
+
+template <class T>
+void tst_QFxListView::items()
+{
+ QFxView *canvas = createView(SRCDIR "/data/listview.xml");
+
+ T model;
+ model.addItem("Fred", "12345");
+ model.addItem("John", "2345");
+ model.addItem("Bob", "54321");
+
+ QmlContext *ctxt = canvas->rootContext();
+ ctxt->setProperty("testModel", &model);
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxFlickable *listview = findItem<QFxFlickable>(canvas->root(), "list");
+ QVERIFY(listview != 0);
+
+ QFxItem *viewport = listview->viewport();
+ QVERIFY(viewport != 0);
+
+ QCOMPARE(viewport->children()->count(), model.count()); // assumes all are visible
+
+ for (int i = 0; i < model.count(); ++i) {
+ QFxText *name = findItem<QFxText>(viewport, "textName", i);
+ QVERIFY(name != 0);
+ QCOMPARE(name->text(), model.name(i));
+ QFxText *number = findItem<QFxText>(viewport, "textNumber", i);
+ QVERIFY(number != 0);
+ QCOMPARE(number->text(), model.number(i));
+ }
+
+ delete canvas;
+}
+
+template <class T>
+void tst_QFxListView::changed()
+{
+ QFxView *canvas = createView(SRCDIR "/data/listview.xml");
+
+ T model;
+ model.addItem("Fred", "12345");
+ model.addItem("John", "2345");
+ model.addItem("Bob", "54321");
+
+ QmlContext *ctxt = canvas->rootContext();
+ ctxt->setProperty("testModel", &model);
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxFlickable *listview = findItem<QFxFlickable>(canvas->root(), "list");
+ QVERIFY(listview != 0);
+
+ QFxItem *viewport = listview->viewport();
+ QVERIFY(viewport != 0);
+
+ model.modifyItem(1, "Will", "9876");
+ QFxText *name = findItem<QFxText>(viewport, "textName", 1);
+ QVERIFY(name != 0);
+ QCOMPARE(name->text(), model.name(1));
+ QFxText *number = findItem<QFxText>(viewport, "textNumber", 1);
+ QVERIFY(number != 0);
+ QCOMPARE(number->text(), model.number(1));
+
+ delete canvas;
+}
+
+template <class T>
+void tst_QFxListView::inserted()
+{
+ QFxView *canvas = createView(SRCDIR "/data/listview.xml");
+
+ T model;
+ model.addItem("Fred", "12345");
+ model.addItem("John", "2345");
+ model.addItem("Bob", "54321");
+
+ QmlContext *ctxt = canvas->rootContext();
+ ctxt->setProperty("testModel", &model);
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxListView *listview = findItem<QFxListView>(canvas->root(), "list");
+ QVERIFY(listview != 0);
+
+ QFxItem *viewport = listview->viewport();
+ QVERIFY(viewport != 0);
+
+ model.insertItem(1, "Will", "9876");
+
+ // let transitions settle.
+ QTest::qWait(1000);
+
+ QCOMPARE(viewport->children()->count(), model.count()); // assumes all are visible
+
+ QFxText *name = findItem<QFxText>(viewport, "textName", 1);
+ QVERIFY(name != 0);
+ QCOMPARE(name->text(), model.name(1));
+ QFxText *number = findItem<QFxText>(viewport, "textNumber", 1);
+ QVERIFY(number != 0);
+ QCOMPARE(number->text(), model.number(1));
+
+ // Confirm items positioned correctly
+ for (int i = 0; i < model.count(); ++i) {
+ QFxItem *item = findItem<QFxItem>(viewport, "wrapper", i);
+ QVERIFY(item->y() == i*20);
+ }
+
+ model.insertItem(0, "Foo", "1111"); // zero index, and current item
+
+ // let transitions settle.
+ QTest::qWait(1000);
+
+ QCOMPARE(viewport->children()->count(), model.count()); // assumes all are visible
+
+ name = findItem<QFxText>(viewport, "textName", 0);
+ QVERIFY(name != 0);
+ QCOMPARE(name->text(), model.name(0));
+ number = findItem<QFxText>(viewport, "textNumber", 0);
+ QVERIFY(number != 0);
+ QCOMPARE(number->text(), model.number(0));
+
+ QCOMPARE(listview->currentIndex(), 1);
+
+ // Confirm items positioned correctly
+ for (int i = 0; i < model.count(); ++i) {
+ QFxItem *item = findItem<QFxItem>(viewport, "wrapper", i);
+ QVERIFY(item->y() == i*20);
+ }
+
+ delete canvas;
+}
+
+template <class T>
+void tst_QFxListView::removed()
+{
+ QFxView *canvas = createView(SRCDIR "/data/listview.xml");
+
+ T model;
+ for (int i = 0; i < 30; i++)
+ model.addItem("Item" + QString::number(i), "");
+
+ QmlContext *ctxt = canvas->rootContext();
+ ctxt->setProperty("testModel", &model);
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxListView *listview = findItem<QFxListView>(canvas->root(), "list");
+ QVERIFY(listview != 0);
+
+ QFxItem *viewport = listview->viewport();
+ QVERIFY(viewport != 0);
+
+ model.removeItem(1);
+
+ // let transitions settle.
+ QTest::qWait(1000);
+
+ QFxText *name = findItem<QFxText>(viewport, "textName", 1);
+ QVERIFY(name != 0);
+ QCOMPARE(name->text(), model.name(1));
+ QFxText *number = findItem<QFxText>(viewport, "textNumber", 1);
+ QVERIFY(number != 0);
+ QCOMPARE(number->text(), model.number(1));
+
+ // Confirm items positioned correctly
+ for (int i = 0; i < model.count() && i < viewport->children()->count(); ++i) {
+ QFxItem *item = findItem<QFxItem>(viewport, "wrapper", i);
+ QVERIFY(item->y() == i*20);
+ }
+
+ // Remove first item (which is the current item);
+ model.removeItem(0); // post: top item starts at 20
+
+ // let transitions settle.
+ QTest::qWait(1000);
+
+ name = findItem<QFxText>(viewport, "textName", 0);
+ QVERIFY(name != 0);
+ QCOMPARE(name->text(), model.name(0));
+ number = findItem<QFxText>(viewport, "textNumber", 0);
+ QVERIFY(number != 0);
+ QCOMPARE(number->text(), model.number(0));
+
+ // Confirm items positioned correctly
+ for (int i = 0; i < model.count() && i < viewport->children()->count(); ++i) {
+ QFxItem *item = findItem<QFxItem>(viewport, "wrapper", i);
+ QCOMPARE(item->y(),i*20.0 + 20.0);
+ }
+
+ // Remove items not visible
+ model.removeItem(18);
+ // let transitions settle.
+ QTest::qWait(1000);
+
+ // Confirm items positioned correctly
+ for (int i = 0; i < model.count() && i < viewport->children()->count(); ++i) {
+ QFxItem *item = findItem<QFxItem>(viewport, "wrapper", i);
+ QCOMPARE(item->y(),i*20.0+20.0);
+ }
+
+ // Remove items before visible
+ listview->setYPosition(80);
+ listview->setCurrentIndex(10);
+
+ model.removeItem(1); // post: top item will be at 40
+ // let transitions settle.
+ QTest::qWait(1000);
+
+ // Confirm items positioned correctly
+ for (int i = 2; i < 18; ++i) {
+ QFxItem *item = findItem<QFxItem>(viewport, "wrapper", i);
+ QCOMPARE(item->y(),40+i*20.0);
+ }
+
+ listview->setYPosition(40); // That's the top now
+ // let transitions settle.
+ QTest::qWait(1000);
+
+ // Confirm items positioned correctly
+ for (int i = 0; i < model.count() && i < viewport->children()->count(); ++i) {
+ QFxItem *item = findItem<QFxItem>(viewport, "wrapper", i);
+ QCOMPARE(item->y(),40+i*20.0);
+ }
+
+ delete canvas;
+}
+
+void tst_QFxListView::qListModelInterface_items()
+{
+ items<TestModel>();
+}
+
+void tst_QFxListView::qAbstractItemModel_items()
+{
+ items<TestModel2>();
+}
+
+void tst_QFxListView::qListModelInterface_changed()
+{
+ changed<TestModel>();
+}
+
+void tst_QFxListView::qAbstractItemModel_changed()
+{
+ changed<TestModel2>();
+}
+
+void tst_QFxListView::qListModelInterface_inserted()
+{
+ inserted<TestModel>();
+}
+
+void tst_QFxListView::qAbstractItemModel_inserted()
+{
+ inserted<TestModel2>();
+}
+
+void tst_QFxListView::qListModelInterface_removed()
+{
+ removed<TestModel>();
+}
+
+void tst_QFxListView::qAbstractItemModel_removed()
+{
+ removed<TestModel2>();
+}
+
+QFxView *tst_QFxListView::createView(const QString &filename)
+{
+ QFxView *canvas = new QFxView(0);
+ canvas->setFixedSize(240,320);
+
+ QFile file(filename);
+ file.open(QFile::ReadOnly);
+ QString xml = file.readAll();
+ canvas->setXml(xml, filename);
+
+ return canvas;
+}
+
+/*
+ Find an item with the specified id. If index is supplied then the
+ item must also evaluate the {index} expression equal to index
+*/
+template<typename T>
+T *tst_QFxListView::findItem(QFxItem *parent, const QString &id, int index)
+{
+ const QMetaObject &mo = T::staticMetaObject;
+ for (int i = 0; i < parent->children()->count(); ++i) {
+ QFxItem *item = parent->children()->at(i);
+ if (mo.cast(item) && (id.isEmpty() || item->id() == id)) {
+ if (index != -1) {
+ QmlExpression e(item->itemContext(), "index", item);
+ e.setTrackChange(false);
+ if (e.value().toInt() == index)
+ return static_cast<T*>(item);
+ } else {
+ return static_cast<T*>(item);
+ }
+ }
+ item = findItem<T>(item, id, index);
+ if (item)
+ return static_cast<T*>(item);
+ }
+
+ return 0;
+}
+
+QTEST_MAIN(tst_QFxListView)
+
+#include "tst_listview.moc"
diff --git a/tests/auto/declarative/namespaces/data/Red/Rect.qml b/tests/auto/declarative/namespaces/data/Red/Rect.qml
new file mode 100644
index 0000000..c7b3d8c
--- /dev/null
+++ b/tests/auto/declarative/namespaces/data/Red/Rect.qml
@@ -0,0 +1,2 @@
+<Text objectName="x" text="Pretending to be a Rect" color="red">
+</Text>
diff --git a/tests/auto/declarative/namespaces/namespaces.pro b/tests/auto/declarative/namespaces/namespaces.pro
new file mode 100644
index 0000000..f232770
--- /dev/null
+++ b/tests/auto/declarative/namespaces/namespaces.pro
@@ -0,0 +1,6 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_namespaces.cpp
+
+# Define SRCDIR equal to test's source directory
+DEFINES += SRCDIR=\\\"$$PWD\\\"
diff --git a/tests/auto/declarative/namespaces/tst_namespaces.cpp b/tests/auto/declarative/namespaces/tst_namespaces.cpp
new file mode 100644
index 0000000..665651d
--- /dev/null
+++ b/tests/auto/declarative/namespaces/tst_namespaces.cpp
@@ -0,0 +1,94 @@
+#include <qtest.h>
+#include <QtDeclarative/qfxview.h>
+#include <QtDeclarative/qmlcontext.h>
+#include <QtDeclarative/qmlengine.h>
+#include <QtDeclarative/qfxrect.h>
+#include <QtDeclarative/qfxtext.h>
+#include <QDir>
+
+class tst_namespaces : public QObject
+
+{
+ Q_OBJECT
+public:
+ tst_namespaces();
+
+private slots:
+ void simple();
+ void simple_data();
+};
+
+tst_namespaces::tst_namespaces()
+{
+}
+
+void tst_namespaces::simple_data()
+{
+ QTest::addColumn<QString>("qml");
+ QTest::addColumn<bool>("valid");
+ QTest::addColumn<QString>("texts");
+ QTest::addColumn<QString>("rects");
+
+ QTest::newRow("Control") <<
+ "<Rect objectName=\"a\">"
+ "<Rect objectName=\"b\"/>"
+ "</Rect>"
+ << true << "" << "ab";
+
+ QTest::newRow("Control2") <<
+ "<Rect objectName=\"a\">"
+ "<Text objectName=\"b\"/>"
+ "</Rect>"
+ << true << "b" << "a";
+
+ QTest::newRow("Replace builtin") <<
+ "<Rect objectName=\"a\" xmlns:rs=\"http://nokia.com/qml/Red\">"
+ "<rs:Rect objectName=\"b\"/>"
+ "</Rect>"
+ << true << "b" << "a";
+}
+
+void tst_namespaces::simple()
+{
+ QFETCH(QString, qml);
+ QFETCH(bool, valid);
+ QFETCH(QString, texts);
+ QFETCH(QString, rects);
+
+ QFxView canvas(0);
+ canvas.rootContext()->engine()->addNameSpacePath("http://nokia.com/qml", SRCDIR "/data");
+ canvas.setXml(qml);
+ canvas.execute();
+ qApp->processEvents();
+
+ QFxItem *testObject = qobject_cast<QFxItem*>(canvas.root());
+
+ QCOMPARE((testObject != 0),valid);
+
+ if (valid && testObject != 0) {
+ QString textids;
+ QList<QFxText*> textobjects = testObject->findChildren<QFxText*>();
+ if (qobject_cast<QFxText*>(testObject))
+ textids += testObject->objectName();
+ foreach (QFxText *obj, textobjects) {
+ textids += obj->objectName();
+ }
+ if (textids != texts)
+ testObject->dump();
+ QCOMPARE(textids,texts);
+
+ QString rectids;
+ QList<QFxRect*> rectobjects = testObject->findChildren<QFxRect*>();
+ if (qobject_cast<QFxRect*>(testObject))
+ rectids += testObject->objectName();
+ foreach (QFxRect *obj, rectobjects)
+ rectids += obj->objectName();
+ if (rectids != rects)
+ testObject->dump();
+ QCOMPARE(rectids,rects);
+ }
+}
+
+QTEST_MAIN(tst_namespaces)
+
+#include "tst_namespaces.moc"
diff --git a/tests/auto/declarative/numberformatter/numberformatter.pro b/tests/auto/declarative/numberformatter/numberformatter.pro
new file mode 100644
index 0000000..ba391ed
--- /dev/null
+++ b/tests/auto/declarative/numberformatter/numberformatter.pro
@@ -0,0 +1,3 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_numberformatter.cpp
diff --git a/tests/auto/declarative/numberformatter/tst_numberformatter.cpp b/tests/auto/declarative/numberformatter/tst_numberformatter.cpp
new file mode 100644
index 0000000..eaeab51
--- /dev/null
+++ b/tests/auto/declarative/numberformatter/tst_numberformatter.cpp
@@ -0,0 +1,216 @@
+#include <qtest.h>
+#include <QtDeclarative/qmlengine.h>
+#include <QtDeclarative/qmlcomponent.h>
+#include <QtDeclarative/qnumberformat.h>
+#include <QtDeclarative/qmlnumberformatter.h>
+
+class tst_numberformat : public QObject
+{
+ Q_OBJECT
+public:
+ tst_numberformat();
+
+ void init() {}
+ void initTestCase() {}
+
+ void cleanup() {}
+ void cleanupTestCase() {}
+
+private slots:
+ void number_data();
+ void number();
+
+ void text_data();
+ void text();
+
+private:
+ QStringList strings;
+ QList<float> numbers;
+ QStringList formats;
+ QStringList texts;
+};
+
+tst_numberformat::tst_numberformat()
+{
+ strings << "100.0"
+ << "12345"
+ << "1234567"
+ << "0.123"
+ << "0.9999"
+ << "0.989"
+ << "1"
+ << "1.0"
+ << "1.01";
+
+ numbers << 100
+ << 12345
+ << 1234567
+ << 0.123
+ << 0.9999
+ << 0.989
+ << 1
+ << 1.0
+ << 1.01;
+
+ formats << ""
+ << "0000"
+ << "0000.00"
+ << "##"
+ << "##.##"
+ << "#0.00#"
+ << "##,##0.##"
+ << "(000) 000 - 000"
+ << "00000,000.0000";
+
+ //US locale only.
+ texts << "100.000000"
+ << "12345.000000"
+ << "1234567.000000"
+ << "0.123000"
+ << "0.999900"
+ << "0.989000"
+ << "1.000000"
+ << "1.000000"
+ << "1.010000" //end ""
+ << "0100"
+ << "12345"
+ << "1234567"
+ << "0000"
+ << "0001"
+ << "0001"
+ << "0001"
+ << "0001"
+ << "0001" // end "0000"
+ << "0100.00"
+ << "12345.00"
+ << "1234567.00"
+ << "0000.12"
+ << "0001.00"
+ << "0000.99"
+ << "0001.00"
+ << "0001.00"
+ << "0001.01" // end "0000.00"
+ << "100"
+ << "12345"
+ << "1234567"
+ << "0"
+ << "1"
+ << "1"
+ << "1"
+ << "1"
+ << "1" // end "##"
+ << "100"//start "##.##"
+ << "12345"
+ << "1234567"
+ << "0.12"
+ << "1"
+ << "0.99"
+ << "1"
+ << "1"
+ << "1.01" // end "##.##" -- ### EXPECT FAIL ### QNumberFormat::formatDecimal() bug
+ << "100.00" //start "#0.00#"
+ << "12345.00"
+ << "1234567.00"
+ << "0.123"
+ << "1.00"
+ << "0.989"
+ << "1.00"
+ << "1.00"
+ << "1.01" //end "#0.00#"
+ << "100" //start "##,##0.##"
+ << "12,345"
+ << "1,234,567"
+ << "0.12"
+ << "1"
+ << "0.99"
+ << "1"
+ << "1"
+ << "1.01" //end "##,##0.##" -- ### EXPECT FAIL ### QNumberFormat::formatDecimal() bug
+ << "(000) 000 - 100" //start "(000) 000 - 000"
+ << "(000) 012 - 345"
+ << "(001) 234 - 567"
+ << "(000) 000 - 000"
+ << "(000) 000 - 001"
+ << "(000) 000 - 001"
+ << "(000) 000 - 001"
+ << "(000) 000 - 001"
+ << "(000) 000 - 001" // end "(000) 000 - 000"
+ << "00,000,100.0000" // start "00000,000.0000"
+ << "00,012,345.0000"
+ << "01,234,567.0000"
+ << "00,000,000.1230"
+ << "00,000,000.9999"
+ << "00,000,000.9890"
+ << "00,000,001.0000"
+ << "00,000,001.0000"
+ << "00,000,001.0100"; // end
+
+ qDebug() << "strings.size()" << strings.size()
+ << "\nformats.size()" << formats.size()
+ << "texts.size()" << texts.size();
+}
+
+void tst_numberformat::number_data()
+{
+ QTest::addColumn<QString>("string");
+ QTest::addColumn<float>("number");
+
+ for (int i = 0; i < strings.size(); i++)
+ QTest::newRow(QString::number(i).toAscii()) << strings.at(i) << numbers.at(i);
+}
+
+void tst_numberformat::number()
+{
+ // ### tests the conversion from string to float
+ QFETCH(QString, string);
+ QFETCH(float, number);
+
+ QString componentStr = QString("<NumberFormatter number=\"") + string + QString("\"/>");
+
+ QmlEngine engine;
+ QmlComponent formatterComponent(&engine, componentStr.toAscii());
+ QmlNumberFormatter *formatter = qobject_cast<QmlNumberFormatter*>(formatterComponent.create());
+ QVERIFY(formatter != 0);
+ QCOMPARE((float)formatter->number(), number);
+ //qDebug() << formatter->format() << formatter->text();
+ QVERIFY(formatter->format().isEmpty());
+ QVERIFY(formatter->text() == QString("%1").arg(number, -1, 'f', -1));
+}
+
+void tst_numberformat::text_data()
+{
+ QTest::addColumn<QString>("string");
+ QTest::addColumn<QString>("format");
+ QTest::addColumn<QString>("text");
+
+ for (int j=0; j < formats.size(); j++)
+ {
+ for (int i=0; i < strings.size(); i++)
+ {
+ QTest::newRow(QString("%1, %2").arg(strings.at(i)).arg(formats.at(j)).toAscii())
+ << strings.at(i) << formats.at(j) << texts.at(j*formats.size()+i);
+ }
+ }
+
+}
+
+void tst_numberformat::text()
+{
+ QFETCH(QString, string);
+ QFETCH(QString, format);
+ QFETCH(QString, text);
+
+ QString componentStr = QString("<NumberFormatter number=\"") + string + QString("\" format=\"") + format + QString("\" />");
+
+ QmlEngine engine;
+ QmlComponent formatterComponent(&engine, componentStr.toAscii());
+ QmlNumberFormatter *formatter = qobject_cast<QmlNumberFormatter*>(formatterComponent.create());
+ QVERIFY(formatter != 0);
+
+ QCOMPARE(formatter->format(), format);
+ QCOMPARE(formatter->text(), text);
+}
+
+QTEST_MAIN(tst_numberformat)
+
+#include "tst_numberformatter.moc"
diff --git a/tests/auto/declarative/pathview/data/pathview.xml b/tests/auto/declarative/pathview/data/pathview.xml
new file mode 100644
index 0000000..26b426c
--- /dev/null
+++ b/tests/auto/declarative/pathview/data/pathview.xml
@@ -0,0 +1,20 @@
+<Rect width="240" height="320" color="#ffffff">
+ <resources>
+ <Component id="Delegate">
+ <Rect id="wrapper" height="20" width="60" color="white" pen.color="black">
+ <Text text="{index}"/>
+ <Text x="20" id="textName" text="{name}"/>
+ <Text x="40" id="textNumber" text="{number}"/>
+ </Rect>
+ </Component>
+ </resources>
+ <PathView id="view" width="240" height="320" model="{testModel}" delegate="{Delegate}" snapPos="0.01">
+ <path>
+ <Path startY="120" startX="160">
+ <PathQuad y="120" x="80" controlY="330" controlX="100"/>
+ <PathLine y="160" x="20"/>
+ <PathCubic y="120" x="160" control1Y="0" control1X="100" control2Y="000" control2X="200"/>
+ </Path>
+ </path>
+ </PathView>
+</Rect>
diff --git a/tests/auto/declarative/pathview/pathview.pro b/tests/auto/declarative/pathview/pathview.pro
new file mode 100644
index 0000000..28bbe49
--- /dev/null
+++ b/tests/auto/declarative/pathview/pathview.pro
@@ -0,0 +1,6 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_pathview.cpp
+
+# Define SRCDIR equal to test's source directory
+DEFINES += SRCDIR=\\\"$$PWD\\\"
diff --git a/tests/auto/declarative/pathview/tst_pathview.cpp b/tests/auto/declarative/pathview/tst_pathview.cpp
new file mode 100644
index 0000000..4d58e57
--- /dev/null
+++ b/tests/auto/declarative/pathview/tst_pathview.cpp
@@ -0,0 +1,259 @@
+#include <QtTest/QtTest>
+#include <qlistmodelinterface.h>
+#include <qfxview.h>
+#include <qfxpathview.h>
+#include <qfxtext.h>
+#include <qfxrect.h>
+#include <qmlcontext.h>
+#include <qmlexpression.h>
+
+class tst_QFxPathView : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QFxPathView();
+
+private slots:
+ void items();
+ void pathMoved();
+ void limitedItems();
+
+private:
+ QFxView *createView(const QString &filename);
+ template<typename T>
+ T *findItem(QFxItem *parent, const QString &id, int index=0);
+};
+
+class TestModel : public QListModelInterface
+{
+ Q_OBJECT
+public:
+ TestModel(QObject *parent = 0) : QListModelInterface(parent) {}
+ ~TestModel() {}
+
+ enum Roles { Name, Number };
+
+ QString name(int index) const { return list.at(index).first; }
+ QString number(int index) const { return list.at(index).second; }
+
+ int count() const { return list.count(); }
+
+ QList<int> roles() const { return QList<int>() << Name << Number; }
+ QString toString(int role) const {
+ switch(role) {
+ case Name:
+ return "name";
+ case Number:
+ return "number";
+ default:
+ return "";
+ }
+ }
+
+ QHash<int, QVariant> data(int index, const QList<int> &roles) const {
+ QHash<int,QVariant> returnHash;
+
+ for (int i = 0; i < roles.size(); ++i) {
+ int role = roles.at(i);
+ QVariant info;
+ switch(role) {
+ case Name:
+ info = list.at(index).first;
+ break;
+ case Number:
+ info = list.at(index).second;
+ break;
+ default:
+ break;
+ }
+ returnHash.insert(role, info);
+ }
+ return returnHash;
+ }
+
+ void addItem(const QString &name, const QString &number) {
+ list.append(QPair<QString,QString>(name, number));
+ emit itemsInserted(list.count()-1, 1);
+ }
+
+ void insertItem(int index, const QString &name, const QString &number) {
+ list.insert(index, QPair<QString,QString>(name, number));
+ emit itemsInserted(index, 1);
+ }
+
+ void removeItem(int index) {
+ list.removeAt(index);
+ emit itemsRemoved(index, 1);
+ }
+
+ void modifyItem(int index, const QString &name, const QString &number) {
+ list[index] = QPair<QString,QString>(name, number);
+ emit itemsChanged(index, 1, roles());
+ }
+
+private:
+ QList<QPair<QString,QString> > list;
+};
+
+tst_QFxPathView::tst_QFxPathView()
+{
+}
+
+void tst_QFxPathView::items()
+{
+ QFxView *canvas = createView(SRCDIR "/data/pathview.xml");
+
+ TestModel model;
+ model.addItem("Fred", "12345");
+ model.addItem("John", "2345");
+ model.addItem("Bob", "54321");
+
+ QmlContext *ctxt = canvas->rootContext();
+ ctxt->setProperty("testModel", &model);
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxPathView *pathview = findItem<QFxPathView>(canvas->root(), "view");
+ QVERIFY(pathview != 0);
+
+ QCOMPARE(pathview->children()->count(), model.count()); // assumes all are visible
+
+ for (int i = 0; i < model.count(); ++i) {
+ QFxText *name = findItem<QFxText>(pathview, "textName", i);
+ QVERIFY(name != 0);
+ QCOMPARE(name->text(), model.name(i));
+ QFxText *number = findItem<QFxText>(pathview, "textNumber", i);
+ QVERIFY(number != 0);
+ QCOMPARE(number->text(), model.number(i));
+ }
+
+ delete canvas;
+}
+
+void tst_QFxPathView::pathMoved()
+{
+ QFxView *canvas = createView(SRCDIR "/data/pathview.xml");
+
+ TestModel model;
+ model.addItem("Ben", "12345");
+ model.addItem("Bohn", "2345");
+ model.addItem("Bob", "54321");
+ model.addItem("Bill", "4321");
+
+ QmlContext *ctxt = canvas->rootContext();
+ ctxt->setProperty("testModel", &model);
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxPathView *pathview = findItem<QFxPathView>(canvas->root(), "view");
+ QVERIFY(pathview != 0);
+
+ QFxRect *firstItem = findItem<QFxRect>(pathview, "wrapper", 0);
+ QVERIFY(firstItem);
+ QFxPath *path = qobject_cast<QFxPath*>(pathview->path());
+ QVERIFY(path);
+ QPointF start = path->pointAt(0.0);
+ QPointF offset;//Center of item is at point, but pos is from corner
+ offset.setX(firstItem->width()/2);
+ offset.setY(firstItem->height()/2);
+ QCOMPARE(firstItem->pos() + offset, start);
+ pathview->setOffset(10);
+ QTest::qWait(1000);//Moving is animated?
+
+ for(int i=0; i<model.count(); i++){
+ QFxRect *curItem = findItem<QFxRect>(pathview, "wrapper", i);
+ QCOMPARE(curItem->pos() + offset, path->pointAt(0.1 + i*0.25));
+ }
+
+ pathview->setOffset(100);
+ QTest::qWait(1000);//Moving is animated?
+ QCOMPARE(firstItem->pos() + offset, start);
+
+ delete canvas;
+}
+
+void tst_QFxPathView::limitedItems()
+{
+ QFxView *canvas = createView(SRCDIR "/data/pathview.xml");
+
+ TestModel model;
+ for(int i=0; i<100; i++)
+ model.addItem("Bob", QString::number(i));
+
+ QmlContext *ctxt = canvas->rootContext();
+ ctxt->setProperty("testModel", &model);
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxPathView *pathview = findItem<QFxPathView>(canvas->root(), "view");
+ QVERIFY(pathview != 0);
+
+ pathview->setPathItemCount(10);
+ QCOMPARE(pathview->pathItemCount(), 10);
+
+ QFxRect *testItem = findItem<QFxRect>(pathview, "wrapper", 0);
+ QVERIFY(testItem != 0);
+ testItem = findItem<QFxRect>(pathview, "wrapper", 9);
+ QVERIFY(testItem != 0);
+ testItem = findItem<QFxRect>(pathview, "wrapper", 10);
+ QVERIFY(testItem == 0);
+
+ pathview->setCurrentIndex(50);
+ QTest::qWait(5100);//Moving is animated and it's travelling far - should be reconsidered.
+ testItem = findItem<QFxRect>(pathview, "wrapper", 0);
+ QVERIFY(testItem == 0);
+ testItem = findItem<QFxRect>(pathview, "wrapper", 1);
+ QVERIFY(testItem == 0);
+ testItem = findItem<QFxRect>(pathview, "wrapper", 9);
+ QVERIFY(testItem == 0);
+ testItem = findItem<QFxRect>(pathview, "wrapper", 50);
+ QVERIFY(testItem != 0);
+}
+
+QFxView *tst_QFxPathView::createView(const QString &filename)
+{
+ QFxView *canvas = new QFxView(0);
+ canvas->setFixedSize(240,320);
+
+ QFile file(filename);
+ file.open(QFile::ReadOnly);
+ QString xml = file.readAll();
+ canvas->setXml(xml, filename);
+
+ return canvas;
+}
+
+/*
+ Find an item with the specified id. If index is supplied then the
+ item must also evaluate the {index} expression equal to index
+*/
+template<typename T>
+T *tst_QFxPathView::findItem(QFxItem *parent, const QString &id, int index)
+{
+ const QMetaObject &mo = T::staticMetaObject;
+ for (int i = 0; i < parent->children()->count(); ++i) {
+ QFxItem *item = parent->children()->at(i);
+ if (mo.cast(item) && (id.isEmpty() || item->id() == id)) {
+ if (index != -1) {
+ QmlExpression e(item->itemContext(), "index", item);
+ e.setTrackChange(false);
+ if (e.value().toInt() == index)
+ return static_cast<T*>(item);
+ } else {
+ return static_cast<T*>(item);
+ }
+ }
+ item = findItem<T>(item, id, index);
+ if (item)
+ return static_cast<T*>(item);
+ }
+
+ return 0;
+}
+
+QTEST_MAIN(tst_QFxPathView)
+
+#include "tst_pathview.moc"
diff --git a/tests/auto/declarative/qbindablemap/qbindablemap.pro b/tests/auto/declarative/qbindablemap/qbindablemap.pro
new file mode 100644
index 0000000..b042405
--- /dev/null
+++ b/tests/auto/declarative/qbindablemap/qbindablemap.pro
@@ -0,0 +1,3 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_qbindablemap.cpp
diff --git a/tests/auto/declarative/qbindablemap/tst_qbindablemap.cpp b/tests/auto/declarative/qbindablemap/tst_qbindablemap.cpp
new file mode 100644
index 0000000..9519382
--- /dev/null
+++ b/tests/auto/declarative/qbindablemap/tst_qbindablemap.cpp
@@ -0,0 +1,72 @@
+#include <qtest.h>
+#include <QtDeclarative/qmlengine.h>
+#include <QtDeclarative/qmlcontext.h>
+#include <QtDeclarative/qbindablemap.h>
+#include <QtDeclarative/qmlcomponent.h>
+#include <QSignalSpy>
+
+class tst_QBindableMap : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QBindableMap() {}
+
+private slots:
+ void insert();
+ void clear();
+ void changed();
+};
+
+void tst_QBindableMap::insert()
+{
+ QBindableMap map;
+ map.setValue(QLatin1String("key1"),100);
+ map.setValue(QLatin1String("key2"),200);
+ QVERIFY(map.keys().count() == 2);
+
+ QCOMPARE(map.value(QLatin1String("key1")), QVariant(100));
+ QCOMPARE(map.value(QLatin1String("key2")), QVariant(200));
+
+ map.setValue(QLatin1String("key1"),"Hello World");
+ QCOMPARE(map.value(QLatin1String("key1")), QVariant("Hello World"));
+}
+
+void tst_QBindableMap::clear()
+{
+ QBindableMap map;
+ map.setValue(QLatin1String("key1"),100);
+ QVERIFY(map.keys().count() == 1);
+
+ QCOMPARE(map.value(QLatin1String("key1")), QVariant(100));
+
+ map.clearValue(QLatin1String("key1"));
+ QVERIFY(map.keys().count() == 1);
+ QCOMPARE(map.value(QLatin1String("key1")), QVariant());
+}
+
+void tst_QBindableMap::changed()
+{
+ QBindableMap map;
+ QSignalSpy spy(&map, SIGNAL(changed(const QString&)));
+ map.setValue(QLatin1String("key1"),100);
+ map.setValue(QLatin1String("key2"),200);
+ QCOMPARE(spy.count(), 0);
+
+ map.clearValue(QLatin1String("key1"));
+ QCOMPARE(spy.count(), 0);
+
+ //make changes in QML
+ QmlEngine engine;
+ QmlContext *ctxt = engine.rootContext();
+ ctxt->setProperty("data", &map);
+ QmlComponent component(&engine, "<Script script=\"data.key1 = 'Hello World';\"/>");
+ component.create();
+ QCOMPARE(spy.count(), 1);
+ QList<QVariant> arguments = spy.takeFirst();
+ QCOMPARE(arguments.at(0).toString(),QLatin1String("key1"));
+ QCOMPARE(map.value(QLatin1String("key1")), QVariant("Hello World"));
+}
+
+QTEST_MAIN(tst_QBindableMap)
+
+#include "tst_qbindablemap.moc"
diff --git a/tests/auto/declarative/qfxtext/qfxtext.pro b/tests/auto/declarative/qfxtext/qfxtext.pro
new file mode 100644
index 0000000..f705334
--- /dev/null
+++ b/tests/auto/declarative/qfxtext/qfxtext.pro
@@ -0,0 +1,3 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui
+SOURCES += tst_qfxtext.cpp
diff --git a/tests/auto/declarative/qfxtext/tst_qfxtext.cpp b/tests/auto/declarative/qfxtext/tst_qfxtext.cpp
new file mode 100644
index 0000000..2448898
--- /dev/null
+++ b/tests/auto/declarative/qfxtext/tst_qfxtext.cpp
@@ -0,0 +1,412 @@
+#include <qtest.h>
+#include <QTextDocument>
+#include <QtDeclarative/qmlengine.h>
+#include <QtDeclarative/qmlcomponent.h>
+#include <QtDeclarative/qfxtext.h>
+#include <QFontMetrics>
+
+class tst_qfxtext : public QObject
+
+{
+ Q_OBJECT
+public:
+ tst_qfxtext();
+
+private slots:
+ void text();
+ void width();
+ void wrap();
+ void elide();
+
+ // ### these tests may be trivial
+ void hAlign();
+ void vAlign();
+ void font();
+ void style();
+ void color();
+
+private:
+ QStringList standard;
+ QStringList richText;
+
+ QStringList hAlignmentStrings;
+ QStringList vAlignmentStrings;
+
+ QList<Qt::Alignment> vAlignments;
+ QList<Qt::Alignment> hAlignments;
+
+ QStringList styleStrings;
+ QList<QFxText::TextStyle> styles;
+
+ QStringList colorStrings;
+
+ QmlEngine engine;
+};
+
+tst_qfxtext::tst_qfxtext()
+{
+ standard << "the quick brown fox jumped over the lazy dog"
+ << "the quick brown fox\n jumped over the lazy dog";
+
+ richText << "<i>the <b>quick</b> brown <a href=\"http://www.google.com\">fox</a> jumped over the <b>lazy</b> dog</i>"
+ << "<i>the <b>quick</b> brown <a href=\"http://www.google.com\">fox</a><br>jumped over the <b>lazy</b> dog</i>";
+
+ hAlignmentStrings << "AlignLeft"
+ << "AlignRight"
+ << "AlignHCenter";
+
+ vAlignmentStrings << "AlignTop"
+ << "AlignBottom"
+ << "AlignVCenter";
+
+ hAlignments << Qt::AlignLeft
+ << Qt::AlignRight
+ << Qt::AlignHCenter;
+
+ vAlignments << Qt::AlignTop
+ << Qt::AlignBottom
+ << Qt::AlignVCenter;
+
+ styleStrings << "Normal"
+ << "Outline"
+ << "Raised"
+ << "Sunken";
+
+ styles << QFxText::Normal
+ << QFxText::Outline
+ << QFxText::Raised
+ << QFxText::Sunken;
+
+ colorStrings << "aliceblue"
+ << "antiquewhite"
+ << "aqua"
+ << "darkkhaki"
+ << "darkolivegreen"
+ << "dimgray"
+ << "palevioletred"
+ << "lightsteelblue"
+ << "#000000"
+ << "#AAAAAA"
+ << "#FFFFFF"
+ << "#2AC05F";
+ //
+ // need a different test to do alpha channel test
+ // << "#AA0011DD"
+ // << "#00F16B11";
+ //
+}
+
+void tst_qfxtext::text()
+{
+ {
+ QmlComponent textComponent(&engine, "<Text text=\"\" />");
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QVERIFY(textObject != 0);
+ QCOMPARE(textObject->text(), QString(""));
+ }
+
+ for (int i = 0; i < standard.size(); i++)
+ {
+ QString componentStr = "<Text>" + standard.at(i) + "</Text>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QVERIFY(textObject != 0);
+ QCOMPARE(textObject->text(), standard.at(i));
+ }
+
+ for (int i = 0; i < richText.size(); i++)
+ {
+ QString componentStr = "<Text><![CDATA[" + richText.at(i) + "]]></Text>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QVERIFY(textObject != 0);
+ QCOMPARE(textObject->text(), richText.at(i));
+ }
+}
+
+void tst_qfxtext::width()
+{
+ // uses Font metrics to find the width for standard and document to find the width for rich
+ {
+ QmlComponent textComponent(&engine, "<Text text=\"\"/>");
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->width(), 0);
+ }
+
+ for (int i = 0; i < standard.size(); i++)
+ {
+ QFont f;
+ QFontMetrics fm(f);
+ int metricWidth = fm.size(Qt::TextExpandTabs && Qt::TextShowMnemonic, standard.at(i)).width();
+
+ QString componentStr = "<Text>" + standard.at(i) + "</Text>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->width(), metricWidth);
+ }
+
+ for (int i = 0; i < richText.size(); i++)
+ {
+ QTextDocument document;
+ document.setHtml(richText.at(i));
+ document.setDocumentMargin(0);
+
+ int documentWidth = document.idealWidth();
+
+ QString componentStr = "<Text><![CDATA[" + richText.at(i) + "]]></Text>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->width(), documentWidth);
+ }
+}
+
+void tst_qfxtext::wrap()
+{
+ // XXX Poor coverage - should at least be testing an expected height.
+
+ // for specified width and wrap set true
+ {
+ QmlComponent textComponent(&engine, "<Text text=\"\" wrap=\"true\" width=\"300\"/>");
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->width(), 300);
+ }
+
+ for (int i = 0; i < standard.size(); i++)
+ {
+ QString componentStr = "<Text wrap=\"true\" width=\"300\">" + standard.at(i) + "</Text>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->width(), 300);
+ }
+
+ for (int i = 0; i < richText.size(); i++)
+ {
+ QString componentStr = "<Text wrap=\"true\" width=\"300\"><![CDATA[" + richText.at(i) + "]]></Text>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->width(), 300);
+ }
+
+}
+
+void tst_qfxtext::elide()
+{
+ for (Qt::TextElideMode m = Qt::ElideLeft; m<=Qt::ElideNone; m=Qt::TextElideMode(int(m)+1)) {
+ const char* elidename[]={"ElideLeft", "ElideRight", "ElideMiddle", "ElideNone"};
+ QString elide = "elide=\""+QString(elidename[int(m)])+"\"";
+
+ // XXX Poor coverage.
+
+ {
+ QmlComponent textComponent(&engine, ("<Text text=\"\" "+elide+" width=\"300\"/>").toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->width(), 300);
+ }
+
+ for (int i = 0; i < standard.size(); i++)
+ {
+ QString componentStr = "<Text "+elide+" width=\"300\">" + standard.at(i) + "</Text>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->width(), 300);
+ }
+
+ // richtext - does nothing
+ for (int i = 0; i < richText.size(); i++)
+ {
+ QString componentStr = "<Text "+elide+" width=\"300\"><![CDATA[" + richText.at(i) + "]]></Text>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->width(), 300);
+ }
+ }
+}
+
+//the alignment tests may be trivial o.oa
+void tst_qfxtext::hAlign()
+{
+ //test one align each, and then test if two align fails.
+
+ for (int i = 0; i < standard.size(); i++)
+ {
+ for (int j=0; j < hAlignmentStrings.size(); j++)
+ {
+ QString componentStr = "<Text hAlign=\"" + hAlignmentStrings.at(j) + "\">" + standard.at(i) + "</Text>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE((int)textObject->hAlign(), (int)hAlignments.at(j));
+ }
+ }
+
+ for (int i = 0; i < richText.size(); i++)
+ {
+ for (int j=0; j < hAlignmentStrings.size(); j++)
+ {
+ QString componentStr = "<Text hAlign=\"" + hAlignmentStrings.at(j) + "\"><![CDATA[" + richText.at(i) + "]]></Text>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE((int)textObject->hAlign(), (int)hAlignments.at(j));
+ }
+ }
+
+}
+
+void tst_qfxtext::vAlign()
+{
+ //test one align each, and then test if two align fails.
+
+ for (int i = 0; i < standard.size(); i++)
+ {
+ for (int j=0; j < vAlignmentStrings.size(); j++)
+ {
+ QString componentStr = "<Text vAlign=\"" + vAlignmentStrings.at(j) + "\">" + standard.at(i) + "</Text>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE((int)textObject->vAlign(), (int)vAlignments.at(j));
+ }
+ }
+
+ for (int i = 0; i < richText.size(); i++)
+ {
+ for (int j=0; j < vAlignmentStrings.size(); j++)
+ {
+ QString componentStr = "<Text vAlign=\"" + vAlignmentStrings.at(j) + "\"><![CDATA[" + richText.at(i) + "]]></Text>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE((int)textObject->vAlign(), (int)vAlignments.at(j));
+ }
+ }
+
+}
+
+void tst_qfxtext::font()
+{
+ //test size, then bold, then italic, then family
+ {
+ QString componentStr = "<Text font.size=\"40\" text=\"Hello World\"/>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->font()->size(), qreal(40));
+ QCOMPARE(textObject->font()->bold(), false);
+ QCOMPARE(textObject->font()->italic(), false);
+ }
+
+ {
+ QString componentStr = "<Text font.bold=\"true\" text=\"Hello World\"/>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->font()->bold(), true);
+ QCOMPARE(textObject->font()->italic(), false);
+ }
+
+ {
+ QString componentStr = "<Text font.italic=\"true\" text=\"Hello World\"/>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->font()->italic(), true);
+ QCOMPARE(textObject->font()->bold(), false);
+ }
+
+ {
+ QString componentStr = "<Text font.family=\"Helvetica\" text=\"Hello World\"/>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->font()->family(), QString("Helvetica"));
+ QCOMPARE(textObject->font()->bold(), false);
+ QCOMPARE(textObject->font()->italic(), false);
+ }
+
+ {
+ QString componentStr = "<Text font.family=\"\" text=\"Hello World\"/>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->font()->family(), QString(""));
+ }
+}
+
+void tst_qfxtext::style()
+{
+ //test style
+ for (int i = 0; i < styles.size(); i++)
+ {
+ QString componentStr = "<Text style=\"" + styleStrings.at(i) + "\" text=\"Hello World\"/>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE((int)textObject->style(), (int)styles.at(i));
+ QCOMPARE(textObject->styleColor(), QColor());
+ }
+}
+
+void tst_qfxtext::color()
+{
+ //test style
+ for (int i = 0; i < colorStrings.size(); i++)
+ {
+ QString componentStr = "<Text color=\"" + colorStrings.at(i) + "\" text=\"Hello World\"/>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->color(), QColor(colorStrings.at(i)));
+ QCOMPARE(textObject->styleColor(), QColor());
+ }
+
+ for (int i = 0; i < colorStrings.size(); i++)
+ {
+ QString componentStr = "<Text styleColor=\"" + colorStrings.at(i) + "\" text=\"Hello World\"/>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(i)));
+ // default color to black?
+ QCOMPARE(textObject->color(), QColor("black"));
+ }
+
+ for (int i = 0; i < colorStrings.size(); i++)
+ {
+ for (int j = 0; j < colorStrings.size(); j++)
+ {
+ QString componentStr = "<Text color=\"" + colorStrings.at(i) + "\" styleColor=\"" + colorStrings.at(j) + "\" text=\"Hello World\"/>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->color(), QColor(colorStrings.at(i)));
+ QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(j)));
+ }
+ }
+ {
+ QString colorStr = "#AA001234";
+ QColor testColor("#001234");
+ testColor.setAlpha(170);
+
+ QString componentStr = "<Text color=\"" + colorStr + "\" text=\"Hello World\"/>";
+ QmlComponent textComponent(&engine, componentStr.toLatin1());
+ QFxText *textObject = qobject_cast<QFxText*>(textComponent.create());
+
+ QCOMPARE(textObject->color(), testColor);
+ }
+}
+QTEST_MAIN(tst_qfxtext)
+
+#include "tst_qfxtext.moc"
diff --git a/tests/auto/declarative/qfxtextedit/qfxtextedit.pro b/tests/auto/declarative/qfxtextedit/qfxtextedit.pro
new file mode 100644
index 0000000..59ab6e5
--- /dev/null
+++ b/tests/auto/declarative/qfxtextedit/qfxtextedit.pro
@@ -0,0 +1,3 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative gui
+SOURCES += tst_qfxtextedit.cpp
diff --git a/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp b/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp
new file mode 100644
index 0000000..e988918
--- /dev/null
+++ b/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp
@@ -0,0 +1,326 @@
+#include <qtest.h>
+#include <QTextDocument>
+#include <QtDeclarative/qmlengine.h>
+#include <QtDeclarative/qmlcomponent.h>
+#include <QtDeclarative/qfxtextedit.h>
+#include <QFontMetrics>
+
+class tst_qfxtextedit : public QObject
+
+{
+ Q_OBJECT
+public:
+ tst_qfxtextedit();
+
+private slots:
+ void text();
+ void width();
+ void wrap();
+
+ // ### these tests may be trivial
+ void hAlign();
+ void vAlign();
+ void font();
+ void color();
+
+private:
+ QStringList standard;
+ QStringList richText;
+
+ QStringList hAlignmentStrings;
+ QStringList vAlignmentStrings;
+
+ QList<Qt::Alignment> vAlignments;
+ QList<Qt::Alignment> hAlignments;
+
+ QStringList colorStrings;
+
+ QmlEngine engine;
+};
+
+tst_qfxtextedit::tst_qfxtextedit()
+{
+ standard << "the quick brown fox jumped over the lazy dog"
+ << "the quick brown fox\n jumped over the lazy dog";
+
+ richText << "<i>the <b>quick</b> brown <a href=\"http://www.google.com\">fox</a> jumped over the <b>lazy</b> dog</i>"
+ << "<i>the <b>quick</b> brown <a href=\"http://www.google.com\">fox</a><br>jumped over the <b>lazy</b> dog</i>";
+
+ hAlignmentStrings << "AlignLeft"
+ << "AlignRight"
+ << "AlignHCenter";
+
+ vAlignmentStrings << "AlignTop"
+ << "AlignBottom"
+ << "AlignVCenter";
+
+ hAlignments << Qt::AlignLeft
+ << Qt::AlignRight
+ << Qt::AlignHCenter;
+
+ vAlignments << Qt::AlignTop
+ << Qt::AlignBottom
+ << Qt::AlignVCenter;
+
+ colorStrings << "aliceblue"
+ << "antiquewhite"
+ << "aqua"
+ << "darkkhaki"
+ << "darkolivegreen"
+ << "dimgray"
+ << "palevioletred"
+ << "lightsteelblue"
+ << "#000000"
+ << "#AAAAAA"
+ << "#FFFFFF"
+ << "#2AC05F";
+ //
+ // need a different test to do alpha channel test
+ // << "#AA0011DD"
+ // << "#00F16B11";
+ //
+}
+
+void tst_qfxtextedit::text()
+{
+ {
+ QmlComponent texteditComponent(&engine, "<TextEdit text=\"\" />");
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QVERIFY(textEditObject != 0);
+ QCOMPARE(textEditObject->text(), QString(""));
+ }
+
+ for (int i = 0; i < standard.size(); i++)
+ {
+ QString componentStr = "<TextEdit>" + standard.at(i) + "</TextEdit>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QVERIFY(textEditObject != 0);
+ QCOMPARE(textEditObject->text(), standard.at(i));
+ }
+
+ for (int i = 0; i < richText.size(); i++)
+ {
+ QString componentStr = "<TextEdit><![CDATA[" + richText.at(i) + "]]></TextEdit>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QVERIFY(textEditObject != 0);
+ QString actual = textEditObject->text();
+ QString expected = richText.at(i);
+ actual.replace(QRegExp(".*<body[^>]*>"),"");
+ actual.replace(QRegExp("(<[^>]*>)+"),"<>");
+ expected.replace(QRegExp("(<[^>]*>)+"),"<>");
+ QCOMPARE(actual.simplified(),expected.simplified());
+ }
+}
+
+void tst_qfxtextedit::width()
+{
+ // uses Font metrics to find the width for standard and document to find the width for rich
+ {
+ QmlComponent texteditComponent(&engine, "<TextEdit text=\"\"/>");
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE(textEditObject->width(), 0);
+ }
+
+ for (int i = 0; i < standard.size(); i++)
+ {
+ QFont f;
+ QFontMetrics fm(f);
+ int metricWidth = fm.size(Qt::TextExpandTabs && Qt::TextShowMnemonic, standard.at(i)).width();
+
+ QString componentStr = "<TextEdit>" + standard.at(i) + "</TextEdit>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE(textEditObject->width(), metricWidth);
+ }
+
+ for (int i = 0; i < richText.size(); i++)
+ {
+ QTextDocument document;
+ document.setHtml(richText.at(i));
+ document.setDocumentMargin(0);
+
+ int documentWidth = document.idealWidth();
+
+ QString componentStr = "<TextEdit><![CDATA[" + richText.at(i) + "]]></TextEdit>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE(textEditObject->width(), documentWidth);
+ }
+}
+
+void tst_qfxtextedit::wrap()
+{
+ // for specified width and wrap set true
+ {
+ QmlComponent texteditComponent(&engine, "<TextEdit text=\"\" wrap=\"true\" width=\"300\"/>");
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE(textEditObject->width(), 300);
+ }
+
+ for (int i = 0; i < standard.size(); i++)
+ {
+ QString componentStr = "<TextEdit wrap=\"true\" width=\"300\">" + standard.at(i) + "</TextEdit>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE(textEditObject->width(), 300);
+ }
+
+ for (int i = 0; i < richText.size(); i++)
+ {
+ QString componentStr = "<TextEdit wrap=\"true\" width=\"300\"><![CDATA[" + richText.at(i) + "]]></TextEdit>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE(textEditObject->width(), 300);
+ }
+
+}
+
+//the alignment tests may be trivial o.oa
+void tst_qfxtextedit::hAlign()
+{
+ //test one align each, and then test if two align fails.
+
+ for (int i = 0; i < standard.size(); i++)
+ {
+ for (int j=0; j < hAlignmentStrings.size(); j++)
+ {
+ QString componentStr = "<TextEdit hAlign=\"" + hAlignmentStrings.at(j) + "\">" + standard.at(i) + "</TextEdit>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE((int)textEditObject->hAlign(), (int)hAlignments.at(j));
+ }
+ }
+
+ for (int i = 0; i < richText.size(); i++)
+ {
+ for (int j=0; j < hAlignmentStrings.size(); j++)
+ {
+ QString componentStr = "<TextEdit hAlign=\"" + hAlignmentStrings.at(j) + "\"><![CDATA[" + richText.at(i) + "]]></TextEdit>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE((int)textEditObject->hAlign(), (int)hAlignments.at(j));
+ }
+ }
+
+}
+
+void tst_qfxtextedit::vAlign()
+{
+ //test one align each, and then test if two align fails.
+
+ for (int i = 0; i < standard.size(); i++)
+ {
+ for (int j=0; j < vAlignmentStrings.size(); j++)
+ {
+ QString componentStr = "<TextEdit vAlign=\"" + vAlignmentStrings.at(j) + "\">" + standard.at(i) + "</TextEdit>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE((int)textEditObject->vAlign(), (int)vAlignments.at(j));
+ }
+ }
+
+ for (int i = 0; i < richText.size(); i++)
+ {
+ for (int j=0; j < vAlignmentStrings.size(); j++)
+ {
+ QString componentStr = "<TextEdit vAlign=\"" + vAlignmentStrings.at(j) + "\"><![CDATA[" + richText.at(i) + "]]></TextEdit>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE((int)textEditObject->vAlign(), (int)vAlignments.at(j));
+ }
+ }
+
+}
+
+void tst_qfxtextedit::font()
+{
+ //test size, then bold, then italic, then family
+ {
+ QString componentStr = "<TextEdit font.size=\"40\" text=\"Hello World\"/>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE(textEditObject->font()->size(), qreal(40));
+ QCOMPARE(textEditObject->font()->bold(), false);
+ QCOMPARE(textEditObject->font()->italic(), false);
+ }
+
+ {
+ QString componentStr = "<TextEdit font.bold=\"true\" text=\"Hello World\"/>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE(textEditObject->font()->bold(), true);
+ QCOMPARE(textEditObject->font()->italic(), false);
+ }
+
+ {
+ QString componentStr = "<TextEdit font.italic=\"true\" text=\"Hello World\"/>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE(textEditObject->font()->italic(), true);
+ QCOMPARE(textEditObject->font()->bold(), false);
+ }
+
+ {
+ QString componentStr = "<TextEdit font.family=\"Helvetica\" text=\"Hello World\"/>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE(textEditObject->font()->family(), QString("Helvetica"));
+ QCOMPARE(textEditObject->font()->bold(), false);
+ QCOMPARE(textEditObject->font()->italic(), false);
+ }
+
+ {
+ QString componentStr = "<TextEdit font.family=\"\" text=\"Hello World\"/>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE(textEditObject->font()->family(), QString(""));
+ }
+}
+
+void tst_qfxtextedit::color()
+{
+ //test style
+ for (int i = 0; i < colorStrings.size(); i++)
+ {
+ QString componentStr = "<TextEdit color=\"" + colorStrings.at(i) + "\" text=\"Hello World\"/>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+ //qDebug() << "textEditObject: " << textEditObject->color() << "vs. " << QColor(colorStrings.at(i));
+ QCOMPARE(textEditObject->color(), QColor(colorStrings.at(i)));
+ }
+
+ {
+ QString colorStr = "#AA001234";
+ QColor testColor("#001234");
+ testColor.setAlpha(170);
+
+ QString componentStr = "<TextEdit color=\"" + colorStr + "\" text=\"Hello World\"/>";
+ QmlComponent texteditComponent(&engine, componentStr.toLatin1());
+ QFxTextEdit *textEditObject = qobject_cast<QFxTextEdit*>(texteditComponent.create());
+
+ QCOMPARE(textEditObject->color(), testColor);
+ }
+}
+QTEST_MAIN(tst_qfxtextedit)
+
+#include "tst_qfxtextedit.moc"
diff --git a/tests/auto/declarative/qmlbindengine/qmlbindengine.pro b/tests/auto/declarative/qmlbindengine/qmlbindengine.pro
new file mode 100644
index 0000000..6d84931
--- /dev/null
+++ b/tests/auto/declarative/qmlbindengine/qmlbindengine.pro
@@ -0,0 +1,3 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_qmlbindengine.cpp
diff --git a/tests/auto/declarative/qmlbindengine/tst_qmlbindengine.cpp b/tests/auto/declarative/qmlbindengine/tst_qmlbindengine.cpp
new file mode 100644
index 0000000..f5b32e8
--- /dev/null
+++ b/tests/auto/declarative/qmlbindengine/tst_qmlbindengine.cpp
@@ -0,0 +1,123 @@
+#include <qtest.h>
+#include <QtDeclarative/qmlcomponent.h>
+#include <QtDeclarative/qmlengine.h>
+
+class MyQmlObject : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(bool trueProperty READ trueProperty)
+ Q_PROPERTY(bool falseProperty READ falseProperty)
+ Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty)
+public:
+ MyQmlObject(): m_methodCalled(false), m_methodIntCalled(false) {}
+
+ bool trueProperty() const { return true; }
+ bool falseProperty() const { return false; }
+
+ QString stringProperty() const { return m_string; }
+ void setStringProperty(const QString &s) { m_string = s; }
+
+ bool methodCalled() const { return m_methodCalled; }
+ bool methodIntCalled() const { return m_methodIntCalled; }
+
+ QString string() const { return m_string; }
+signals:
+ void basicSignal();
+ void argumentSignal(int a, QString b, qreal c);
+
+public slots:
+ void method() { m_methodCalled = true; }
+ void method(int a) { if(a == 163) m_methodIntCalled = true; }
+ void setString(const QString &s) { m_string = s; }
+
+private:
+ friend class tst_qmlbindengine;
+ bool m_methodCalled;
+ bool m_methodIntCalled;
+
+ QString m_string;
+};
+
+QML_DECLARE_TYPE(MyQmlObject);
+QML_DEFINE_TYPE(MyQmlObject,MyQmlObject);
+
+class tst_qmlbindengine : public QObject
+{
+ Q_OBJECT
+public:
+ tst_qmlbindengine() {}
+
+private slots:
+ void boolPropertiesEvaluateAsBool();
+ void methods();
+ void signalAssignment();
+
+private:
+ QmlEngine engine;
+};
+
+void tst_qmlbindengine::boolPropertiesEvaluateAsBool()
+{
+ {
+ QmlComponent component(&engine, "<MyQmlObject stringProperty=\"{trueProperty?'pass':'fail'}\" />");
+ MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
+ QVERIFY(object != 0);
+ QCOMPARE(object->stringProperty(), QLatin1String("pass"));
+ }
+ {
+ QmlComponent component(&engine, "<MyQmlObject stringProperty=\"{falseProperty?'fail':'pass'}\" />");
+ MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
+ QVERIFY(object != 0);
+ QCOMPARE(object->stringProperty(), QLatin1String("pass"));
+ }
+}
+
+void tst_qmlbindengine::signalAssignment()
+{
+ {
+ QmlComponent component(&engine, "<MyQmlObject onBasicSignal=\"setString('pass')\" />");
+ MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
+ QVERIFY(object != 0);
+ QCOMPARE(object->string(), QString());
+ emit object->basicSignal();
+ QCOMPARE(object->string(), QString("pass"));
+ }
+
+ {
+ QmlComponent component(&engine, "<MyQmlObject onArgumentSignal=\"setString('pass ' + a + ' ' + b + ' ' + c)\" />");
+ MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
+ QVERIFY(object != 0);
+ QCOMPARE(object->string(), QString());
+ emit object->argumentSignal(19, "Hello world!", 10.3);
+ QCOMPARE(object->string(), QString("pass 19 Hello world! 10.3"));
+ }
+}
+
+void tst_qmlbindengine::methods()
+{
+ {
+ QmlComponent component(&engine, "<MyQmlObject id=\"MyObject\" onBasicSignal=\"MyObject.method()\" />");
+ MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
+ QVERIFY(object != 0);
+ QCOMPARE(object->methodCalled(), false);
+ QCOMPARE(object->methodIntCalled(), false);
+ emit object->basicSignal();
+ QCOMPARE(object->methodCalled(), true);
+ QCOMPARE(object->methodIntCalled(), false);
+ }
+
+ {
+ QmlComponent component(&engine, "<MyQmlObject id=\"MyObject\" onBasicSignal=\"MyObject.method(163)\" />");
+ MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
+ QVERIFY(object != 0);
+ QCOMPARE(object->methodCalled(), false);
+ QCOMPARE(object->methodIntCalled(), false);
+ emit object->basicSignal();
+ QCOMPARE(object->methodCalled(), false);
+ QCOMPARE(object->methodIntCalled(), true);
+ }
+}
+
+QTEST_MAIN(tst_qmlbindengine)
+
+#include "tst_qmlbindengine.moc"
diff --git a/tests/auto/declarative/qmllist/qmllist.pro b/tests/auto/declarative/qmllist/qmllist.pro
new file mode 100644
index 0000000..e5558f1
--- /dev/null
+++ b/tests/auto/declarative/qmllist/qmllist.pro
@@ -0,0 +1,3 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_qmllist.cpp
diff --git a/tests/auto/declarative/qmllist/tst_qmllist.cpp b/tests/auto/declarative/qmllist/tst_qmllist.cpp
new file mode 100644
index 0000000..541ca64
--- /dev/null
+++ b/tests/auto/declarative/qmllist/tst_qmllist.cpp
@@ -0,0 +1,38 @@
+#include <qtest.h>
+#include <QtDeclarative/qml.h>
+#include <QtDeclarative/qmlprivate.h>
+
+class tst_QmlList : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QmlList() {}
+
+private slots:
+ void interface();
+};
+
+void tst_QmlList::interface()
+{
+ QmlConcreteList<QObject*> list;
+ QObject *obj = new QObject;
+ obj->setObjectName("foo");
+ list.append(obj);
+ QVERIFY(list.count() == 1);
+ QCOMPARE(list.at(0), obj);
+
+ QmlPrivate::ListInterface *li = (QmlPrivate::ListInterface*)&list;
+
+ void *ptr[1];
+ li->at(0, ptr);
+ QVERIFY(li->count() == 1);
+ QCOMPARE(ptr[0], obj);
+
+ li->removeAt(0);
+ QVERIFY(li->count() == 0);
+ QVERIFY(list.count() == 0);
+}
+
+QTEST_MAIN(tst_QmlList)
+
+#include "tst_qmllist.moc"
diff --git a/tests/auto/declarative/qmllistaccessor/qmllistaccessor.pro b/tests/auto/declarative/qmllistaccessor/qmllistaccessor.pro
new file mode 100644
index 0000000..4aa0450
--- /dev/null
+++ b/tests/auto/declarative/qmllistaccessor/qmllistaccessor.pro
@@ -0,0 +1,3 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_qmllistaccessor.cpp
diff --git a/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp b/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp
new file mode 100644
index 0000000..f5b57ea
--- /dev/null
+++ b/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp
@@ -0,0 +1,61 @@
+#include <qtest.h>
+#include <QtDeclarative/qml.h>
+#include <QtDeclarative/qmllistaccessor.h>
+
+class tst_QmlListAccessor : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QmlListAccessor() {}
+
+private slots:
+ void qmllist();
+ //void qlist();
+ //void qstringlist();
+};
+
+void tst_QmlListAccessor::qmllist()
+{
+ QmlConcreteList<QObject*> list;
+ QObject *obj = new QObject;
+ list.append(obj);
+ QVERIFY(list.count() == 1);
+ QCOMPARE(list.at(0), obj);
+
+ QmlListAccessor accessor;
+ accessor.setList(qVariantFromValue((QmlList<QObject*>*)&list));
+
+ QVERIFY(accessor.isValid());
+ QVERIFY(accessor.count() == 1);
+
+ QVariant v = accessor.at(0);
+ QCOMPARE(qvariant_cast<QObject*>(v), obj);
+
+ accessor.removeAt(3);
+ QVERIFY(accessor.count() == 1);
+
+ accessor.removeAt(0);
+ QVERIFY(accessor.count() == 0);
+
+ accessor.insert(4, qVariantFromValue(obj));
+ QVERIFY(accessor.count() == 1);
+
+ v = accessor.at(0);
+ QCOMPARE(qvariant_cast<QObject*>(v), obj);
+
+ QObject *obj2 = new QObject;
+ accessor.append(qVariantFromValue(obj2));
+ QVERIFY(accessor.count() == 2);
+
+ v = accessor.at(1);
+ QCOMPARE(qvariant_cast<QObject*>(v), obj2);
+
+ accessor.clear();
+ QVERIFY(accessor.count() == 0);
+
+ QVERIFY(accessor.isValid());
+}
+
+QTEST_MAIN(tst_QmlListAccessor)
+
+#include "tst_qmllistaccessor.moc"
diff --git a/tests/auto/declarative/qmlmetaproperty/qmlmetaproperty.pro b/tests/auto/declarative/qmlmetaproperty/qmlmetaproperty.pro
new file mode 100644
index 0000000..af67373
--- /dev/null
+++ b/tests/auto/declarative/qmlmetaproperty/qmlmetaproperty.pro
@@ -0,0 +1,3 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_qmlmetaproperty.cpp
diff --git a/tests/auto/declarative/qmlmetaproperty/tst_qmlmetaproperty.cpp b/tests/auto/declarative/qmlmetaproperty/tst_qmlmetaproperty.cpp
new file mode 100644
index 0000000..3a87070
--- /dev/null
+++ b/tests/auto/declarative/qmlmetaproperty/tst_qmlmetaproperty.cpp
@@ -0,0 +1,104 @@
+#include <qtest.h>
+#include <QtDeclarative/QmlEngine.h>
+#include <QtDeclarative/qmlcomponent.h>
+#include <QtDeclarative/qmlmetaproperty.h>
+#include <QtGui/QLineEdit>
+
+class MyQmlObject : public QObject
+{
+ Q_OBJECT
+public:
+ MyQmlObject() {}
+};
+
+QML_DECLARE_TYPE(MyQmlObject);
+QML_DEFINE_TYPE(MyQmlObject,MyQmlObject);
+
+class MyContainer : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QList<MyQmlObject*>* children READ children)
+ Q_PROPERTY(QmlList<MyQmlObject*>* qmlChildren READ qmlChildren)
+public:
+ MyContainer() {}
+
+ QList<MyQmlObject*> *children() { return &m_children; }
+ QmlConcreteList<MyQmlObject *> *qmlChildren() { return &m_qmlChildren; }
+
+private:
+ QList<MyQmlObject*> m_children;
+ QmlConcreteList<MyQmlObject *> m_qmlChildren;
+};
+
+QML_DECLARE_TYPE(MyContainer);
+QML_DEFINE_TYPE(MyContainer,MyContainer);
+
+class tst_QmlMetaProperty : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QmlMetaProperty() {}
+
+private slots:
+ void writeObjectToList();
+ void writeListToList();
+ void writeObjectToQmlList();
+
+ //writeToReadOnly();
+
+private:
+ QmlEngine engine;
+};
+
+void tst_QmlMetaProperty::writeObjectToList()
+{
+ QmlComponent containerComponent(&engine, "<MyContainer><children><MyQmlObject/></children></MyContainer>");
+ MyContainer *container = qobject_cast<MyContainer*>(containerComponent.create());
+ QVERIFY(container != 0);
+ QVERIFY(container->children()->size() == 1);
+
+ MyQmlObject *object = new MyQmlObject;
+ QmlMetaProperty prop(container, "children");
+ prop.write(qVariantFromValue(object));
+ QCOMPARE(container->children()->size(), 2);
+ QCOMPARE(container->children()->at(1), object);
+}
+
+Q_DECLARE_METATYPE(QList<QObject *>);
+void tst_QmlMetaProperty::writeListToList()
+{
+ QmlComponent containerComponent(&engine, "<MyContainer><children><MyQmlObject/></children></MyContainer>");
+ MyContainer *container = qobject_cast<MyContainer*>(containerComponent.create());
+ QVERIFY(container != 0);
+ QVERIFY(container->children()->size() == 1);
+
+ QList<QObject*> objList;
+ objList << new MyQmlObject() << new MyQmlObject() << new MyQmlObject() << new MyQmlObject();
+ QmlMetaProperty prop(container, "children");
+ prop.write(qVariantFromValue(objList));
+ QCOMPARE(container->children()->size(), 4);
+
+ //XXX need to try this with read/write prop (for read-only it correctly doesn't write)
+ /*QList<MyQmlObject*> typedObjList;
+ typedObjList << new MyQmlObject();
+ prop.write(qVariantFromValue(&typedObjList));
+ QCOMPARE(container->children()->size(), 1);*/
+}
+
+void tst_QmlMetaProperty::writeObjectToQmlList()
+{
+ QmlComponent containerComponent(&engine, "<MyContainer><qmlChildren><MyQmlObject/></qmlChildren></MyContainer>");
+ MyContainer *container = qobject_cast<MyContainer*>(containerComponent.create());
+ QVERIFY(container != 0);
+ QVERIFY(container->qmlChildren()->size() == 1);
+
+ MyQmlObject *object = new MyQmlObject;
+ QmlMetaProperty prop(container, "qmlChildren");
+ prop.write(qVariantFromValue(object));
+ QCOMPARE(container->qmlChildren()->size(), 2);
+ QCOMPARE(container->qmlChildren()->at(1), object);
+}
+
+QTEST_MAIN(tst_QmlMetaProperty)
+
+#include "tst_qmlmetaproperty.moc"
diff --git a/tests/auto/declarative/qmlparser/qmlparser.pro b/tests/auto/declarative/qmlparser/qmlparser.pro
new file mode 100644
index 0000000..3e0b6ea
--- /dev/null
+++ b/tests/auto/declarative/qmlparser/qmlparser.pro
@@ -0,0 +1,3 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_qmlparser.cpp
diff --git a/tests/auto/declarative/qmlparser/tst_qmlparser.cpp b/tests/auto/declarative/qmlparser/tst_qmlparser.cpp
new file mode 100644
index 0000000..24d3c22
--- /dev/null
+++ b/tests/auto/declarative/qmlparser/tst_qmlparser.cpp
@@ -0,0 +1,444 @@
+#include <qtest.h>
+#include <QtDeclarative/qmlengine.h>
+#include <QtDeclarative/qmlcomponent.h>
+
+class MyInterface
+{
+public:
+ MyInterface() : id(913) {}
+ int id;
+};
+
+Q_DECLARE_INTERFACE(MyInterface, "com.trolltech.Qt.Test.MyInterface");
+QML_DECLARE_INTERFACE(MyInterface);
+QML_DEFINE_INTERFACE(MyInterface);
+
+class MyQmlObject : public QObject, public MyInterface
+{
+ Q_OBJECT
+ Q_PROPERTY(int value READ value WRITE setValue)
+ Q_PROPERTY(QString readOnlyString READ readOnlyString)
+ Q_PROPERTY(bool enabled READ enabled WRITE setEnabled)
+ Q_PROPERTY(QRect rect READ rect WRITE setRect)
+ Q_PROPERTY(QMatrix matrix READ matrix WRITE setMatrix) //assumed to be unsupported by QML
+ Q_PROPERTY(MyInterface *interface READ interface WRITE setInterface)
+ Q_INTERFACES(MyInterface)
+public:
+ MyQmlObject() : m_value(-1), m_interface(0) {}
+
+ int value() const { return m_value; }
+ void setValue(int v) { m_value = v; }
+
+ QString readOnlyString() const { return QLatin1String(""); }
+
+ bool enabled() const { return false; }
+ void setEnabled(bool) {}
+
+ QRect rect() const { return QRect(); }
+ void setRect(const QRect&) {}
+
+ QMatrix matrix() const { return QMatrix(); }
+ void setMatrix(const QMatrix&) {}
+
+ MyInterface *interface() const { return m_interface; }
+ void setInterface(MyInterface *iface) { m_interface = iface; }
+
+ Q_CLASSINFO("defaultMethod", "basicSlot()");
+
+public slots:
+ void basicSlot() { qWarning("MyQmlObject::basicSlot"); }
+
+signals:
+ void basicSignal();
+
+private:
+ friend class tst_qmlparser;
+ int m_value;
+ MyInterface *m_interface;
+};
+
+QML_DECLARE_TYPE(MyQmlObject);
+QML_DEFINE_TYPE(MyQmlObject,MyQmlObject);
+
+class MyContainer : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QList<QObject*>* children READ children)
+ Q_PROPERTY(QList<MyInterface*>* qlistInterfaces READ qlistInterfaces)
+ Q_PROPERTY(QmlList<MyInterface*>* qmllistInterfaces READ qmllistInterfaces)
+ Q_CLASSINFO("DefaultProperty", "children");
+public:
+ MyContainer() {}
+
+ QList<QObject*> *children() { return &m_children; }
+ QList<MyInterface *> *qlistInterfaces() { return &m_interfaces; }
+ QmlList<MyInterface *> *qmllistInterfaces() { return &m_qmlinterfaces; }
+ const QmlConcreteList<MyInterface *> &qmllistAccessor() const { return m_qmlinterfaces; }
+
+private:
+ QList<QObject*> m_children;
+ QList<MyInterface *> m_interfaces;
+ QmlConcreteList<MyInterface *> m_qmlinterfaces;
+};
+
+QML_DECLARE_TYPE(MyContainer);
+QML_DEFINE_TYPE(MyContainer,MyContainer);
+
+class MyDotPropertyObject : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(MyQmlObject *obj READ obj)
+ Q_PROPERTY(MyQmlObject *readWriteObj READ readWriteObj WRITE setReadWriteObj)
+public:
+ MyDotPropertyObject() : m_rwobj(0), m_ownRWObj(false) {}
+ ~MyDotPropertyObject()
+ {
+ if (m_ownRWObj)
+ delete m_rwobj;
+ }
+
+ MyQmlObject *obj() { return 0; }
+
+ MyQmlObject *readWriteObj()
+ {
+ if (!m_rwobj) {
+ m_rwobj = new MyQmlObject;
+ m_ownRWObj = true;
+ }
+ return m_rwobj;
+ }
+
+ void setReadWriteObj(MyQmlObject *obj)
+ {
+ if (m_ownRWObj) {
+ delete m_rwobj;
+ m_ownRWObj = false;
+ }
+
+ m_rwobj = obj;
+ }
+
+private:
+ MyQmlObject *m_rwobj;
+ bool m_ownRWObj;
+};
+
+QML_DECLARE_TYPE(MyDotPropertyObject);
+QML_DEFINE_TYPE(MyDotPropertyObject,MyDotPropertyObject);
+
+class tst_qmlparser : public QObject
+{
+ Q_OBJECT
+public:
+ tst_qmlparser() {}
+
+private slots:
+ void simpleObject();
+ void simpleContainer();
+ void unregisteredObject();
+ void nonexistantProperty();
+ void unsupportedProperty();
+ //void setProperties();
+ void wrongType();
+ void readOnly();
+ //void dotProperties();
+ void nullDotProperty();
+ void fakeDotProperty();
+ //void readWriteDotProperty();
+ void emptyInput();
+ void missingObject();
+ void invalidXML();
+ void duplicateIDs();
+ void invalidID();
+ void interfaceProperty();
+ void interfaceQmlList();
+ void interfaceQList();
+ void cannotAssignBindingToSignal();
+ void assignObjectToSignal();
+
+private:
+ QmlEngine engine;
+};
+
+void tst_qmlparser::simpleObject()
+{
+ QmlComponent component(&engine, "<MyQmlObject/>");
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+}
+
+void tst_qmlparser::simpleContainer()
+{
+ QmlComponent component(&engine, "<MyContainer>\n<MyQmlObject/>\n<MyQmlObject/>\n</MyContainer>");
+ MyContainer *container= qobject_cast<MyContainer*>(component.create());
+ QVERIFY(container != 0);
+ QCOMPARE(container->children()->count(),2);
+}
+
+void tst_qmlparser::unregisteredObject()
+{
+ QmlComponent component(&engine, "<UnRegisteredObject/>", QUrl("myprogram.qml"));
+ QTest::ignoreMessage(QtWarningMsg, "Unable to create object of type 'UnRegisteredObject' @myprogram.qml:1");
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+}
+
+void tst_qmlparser::nonexistantProperty()
+{
+ //NOTE: these first 3 should all have the same error message
+ {
+ QmlComponent component(&engine, "<MyQmlObject something=\"24\"/>");
+ QTest::ignoreMessage(QtWarningMsg, "Unknown property 'something' @<unspecified file>:1");
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+ }
+
+ {
+ QmlComponent component(&engine, "<MyQmlObject>\n<something>24</something>\n</MyQmlObject>");
+ QTest::ignoreMessage(QtWarningMsg, "Unknown property 'something' @<unspecified file>:2");
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+ }
+
+ //non-existant using binding
+ {
+ QmlComponent component(&engine, "<MyQmlObject something=\"{1}\"/>");
+ QTest::ignoreMessage(QtWarningMsg, "Unknown property 'something' @<unspecified file>:1");
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+ }
+
+ {
+ QmlComponent component(&engine, "<MyQmlObject><something></something></MyQmlObject>");
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+ }
+
+ //non-existant value-type default property
+ {
+ QmlComponent component(&engine, "<MyQmlObject>\n24\n</MyQmlObject>");
+ QTest::ignoreMessage(QtWarningMsg, "Unable to resolve default property @<unspecified file>:3");
+ // XXX would 2 be a better line number in this case? Message should also be improved.
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+ }
+
+ //non-existant object-type default property
+ {
+ QmlComponent component(&engine, "<MyQmlObject>\n<MyQmlObject/>\n</MyQmlObject>");
+ QTest::ignoreMessage(QtWarningMsg, "Unable to assign to non-existant property @<unspecified file>:2");
+ // XXX Message needs to be improved (and should be closer to value-type message).
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+ }
+}
+
+void tst_qmlparser::unsupportedProperty()
+{
+ QTest::ignoreMessage(QtWarningMsg, "Property 'matrix' is of an unknown type @<unspecified file>:1");
+ QmlComponent component(&engine, "<MyQmlObject matrix=\"1,0,0,0,1,0,0,0,1\"/>");
+ MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
+ QVERIFY(object == 0);
+}
+
+void tst_qmlparser::wrongType()
+{
+ //string for int
+ {
+ QTest::ignoreMessage(QtWarningMsg, "Can't assign value 'hello' to property 'value' @<unspecified file>:1");
+ QmlComponent component(&engine, "<MyQmlObject value=\"hello\"/>");
+ MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
+ QVERIFY(object == 0);
+ }
+
+ //int for bool
+ {
+ QTest::ignoreMessage(QtWarningMsg, "Can't assign value '5' to property 'enabled' @<unspecified file>:1");
+ QmlComponent component(&engine, "<MyQmlObject enabled=\"5\"/>");
+ MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
+ QVERIFY(object == 0);
+ }
+
+ //bad format for rect
+ {
+ QTest::ignoreMessage(QtWarningMsg, "Can't assign value '5,5x10' to property 'rect' @<unspecified file>:1");
+ QmlComponent component(&engine, "<MyQmlObject rect=\"5,5x10\"/>");
+ MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
+ QVERIFY(object == 0);
+ }
+
+ //TODO: more types (including float-to-int, complex types, etc)
+}
+
+void tst_qmlparser::readOnly()
+{
+ {
+ QTest::ignoreMessage(QtWarningMsg, "Can't assign value 'hello' to property 'readOnlyString' because 'readOnlyString' is read-only @<unspecified file>:1");
+ QmlComponent component(&engine, "<MyQmlObject readOnlyString=\"hello\"/>");
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+ }
+
+ {
+ QTest::ignoreMessage(QtWarningMsg, "Can't assign a binding to property 'readOnlyString' because 'readOnlyString' is read-only @<unspecified file>:1");
+ QmlComponent component(&engine, "<MyQmlObject readOnlyString=\"{'hello'}\"/>");
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+ }
+}
+
+void tst_qmlparser::nullDotProperty()
+{
+ QTest::ignoreMessage(QtWarningMsg, "Can't set properties on 'obj' because it is null @<unspecified file>:1");
+ QmlComponent component(&engine, "<MyDotPropertyObject obj.value=\"1\"/>");
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+}
+
+void tst_qmlparser::fakeDotProperty()
+{
+ QTest::ignoreMessage(QtWarningMsg, "Can't set properties on 'value' because it isn't a known object type @<unspecified file>:1");
+ QmlComponent component(&engine, "<MyQmlObject value.something=\"hello\"/>");
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+}
+
+//XXX need to define correct behavior first
+/*void tst_qmlparser::readWriteDotProperty()
+{
+ QmlComponent component(&engine, "<MyDotPropertyObject readWriteObj.value=\"1\"/>");
+ MyDotPropertyObject *object = qobject_cast<MyDotPropertyObject*>(component.create());
+ QVERIFY(object != 0);
+ QCOMPARE(object->readWriteObj()->value(),1);
+
+ {
+ QmlComponent component(&engine, "<MyContainer><MyQmlObject id=\"Obj\" value=\"1\"/><MyDotPropertyObject readWriteObj=\"{Obj}\"/></MyContainer>");
+ MyContainer *object = qobject_cast<MyContainer*>(component.create());
+ QVERIFY(object != 0);
+ MyDotPropertyObject *dpo = qobject_cast<MyDotPropertyObject *>(object->children()->at(1));
+ QCOMPARE(dpo->readWriteObj()->value(),1);
+ }
+}*/
+
+void tst_qmlparser::emptyInput()
+{
+ QTest::ignoreMessage(QtCriticalMsg, "No Qml was specified for parsing.");
+ QTest::ignoreMessage(QtWarningMsg, "Can't compile because of earlier errors @<unspecified file>:-1");
+ QmlComponent component(&engine, "");
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+}
+
+void tst_qmlparser::missingObject()
+{
+ QTest::ignoreMessage(QtCriticalMsg, "Can't have a property with no object @<unspecified file>:1");
+ QTest::ignoreMessage(QtWarningMsg, "Can't compile because of earlier errors @<unspecified file>:-1");
+ QmlComponent component(&engine, "<something/>");
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+}
+
+
+void tst_qmlparser::invalidXML()
+{
+ //extra stuff on end
+ {
+ QTest::ignoreMessage(QtCriticalMsg, "Extra content at end of document. @myprogram.qml:1");
+ QTest::ignoreMessage(QtWarningMsg, "Can't compile because of earlier errors @myprogram.qml:-1");
+ QmlComponent component(&engine, "<MyQmlObject/><something/>", QUrl("myprogram.qml"));
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+ }
+
+ //mismatched tags
+ {
+ QTest::ignoreMessage(QtCriticalMsg, "Opening and ending tag mismatch. @myprogram.qml:2");
+ QTest::ignoreMessage(QtWarningMsg, "Can't compile because of earlier errors @myprogram.qml:-1");
+ QmlComponent component(&engine, "<MyQmlObject>\n</MyContainer>", QUrl("myprogram.qml"));
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+ }
+
+ {
+ QTest::ignoreMessage(QtCriticalMsg, "Expected '>' or '/', but got '<'. @myprogram.qml:1");
+ QTest::ignoreMessage(QtWarningMsg, "Can't compile because of earlier errors @myprogram.qml:-1");
+ QmlComponent component(&engine, "<MyQmlObject < />", QUrl("myprogram.qml"));
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+ }
+
+ {
+ QTest::ignoreMessage(QtCriticalMsg, "Premature end of document. @myprogram.qml:1");
+ QTest::ignoreMessage(QtWarningMsg, "Can't compile because of earlier errors @myprogram.qml:-1");
+ QmlComponent component(&engine, "<MyQmlObject something=\" />", QUrl("myprogram.qml"));
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+ }
+
+}
+
+void tst_qmlparser::duplicateIDs()
+{
+ QTest::ignoreMessage(QtWarningMsg, "An id (\"MyID\") is not unique within its scope. @<unspecified file>:3");
+ QmlComponent component(&engine, "<MyContainer>\n<MyQmlObject id=\"MyID\"/>\n<MyQmlObject id=\"MyID\"/>\n</MyContainer>");
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+}
+
+void tst_qmlparser::invalidID()
+{
+ QTest::ignoreMessage(QtWarningMsg, "'1' is not a valid id @<unspecified file>:1");
+ QmlComponent component(&engine, "<MyQmlObject id=\"1\"/>");
+ QObject *object = component.create();
+ QVERIFY(object == 0);
+}
+
+void tst_qmlparser::interfaceProperty()
+{
+ QmlComponent component(&engine, "<MyQmlObject><interface>\n<MyQmlObject/></interface>\n</MyQmlObject>");
+ MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
+ QVERIFY(object != 0);
+ QVERIFY(object->interface());
+ QVERIFY(object->interface()->id == 913);
+}
+
+void tst_qmlparser::interfaceQmlList()
+{
+ QmlComponent component(&engine, "<MyContainer><qmllistInterfaces>\n<MyQmlObject/>\n<MyQmlObject/>\n</qmllistInterfaces>\n</MyContainer>");
+ MyContainer *container= qobject_cast<MyContainer*>(component.create());
+ QVERIFY(container != 0);
+ QVERIFY(container->qmllistAccessor().count() == 2);
+ for(int ii = 0; ii < 2; ++ii)
+ QVERIFY(container->qmllistAccessor().at(ii)->id == 913);
+}
+
+void tst_qmlparser::interfaceQList()
+{
+ QmlComponent component(&engine, "<MyContainer><qlistInterfaces>\n<MyQmlObject/>\n<MyQmlObject/>\n</qlistInterfaces>\n</MyContainer>");
+ MyContainer *container= qobject_cast<MyContainer*>(component.create());
+ QVERIFY(container != 0);
+ QVERIFY(container->qlistInterfaces()->count() == 2);
+ for(int ii = 0; ii < 2; ++ii)
+ QVERIFY(container->qlistInterfaces()->at(ii)->id == 913);
+}
+
+void tst_qmlparser::cannotAssignBindingToSignal()
+{
+ QTest::ignoreMessage(QtWarningMsg, "Cannot assign binding to signal property @<unspecified file>:1");
+ QmlComponent component(&engine, "<MyQmlObject onBasicSignal=\"{print(1921)}\" />");
+ MyContainer *container= qobject_cast<MyContainer*>(component.create());
+ QVERIFY(container == 0);
+}
+
+void tst_qmlparser::assignObjectToSignal()
+{
+ QmlComponent component(&engine, "<MyQmlObject><onBasicSignal><MyQmlObject /></onBasicSignal></MyQmlObject>");
+ MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
+ QVERIFY(object != 0);
+ QTest::ignoreMessage(QtWarningMsg, "MyQmlObject::basicSlot");
+ emit object->basicSignal();
+}
+
+QTEST_MAIN(tst_qmlparser)
+
+#include "tst_qmlparser.moc"
diff --git a/tests/auto/declarative/repeater/data/repeater.xml b/tests/auto/declarative/repeater/data/repeater.xml
new file mode 100644
index 0000000..f863716
--- /dev/null
+++ b/tests/auto/declarative/repeater/data/repeater.xml
@@ -0,0 +1,7 @@
+<Rect id="container" width="240" height="320" color="white">
+ <Repeater id="repeater" width="240" height="320" dataSource="{testData}">
+ <Component>
+ <Text y="{index*20}" text="{modelData}"/>
+ </Component>
+ </Repeater>
+</Rect>
diff --git a/tests/auto/declarative/repeater/repeater.pro b/tests/auto/declarative/repeater/repeater.pro
new file mode 100644
index 0000000..0ecd7ee
--- /dev/null
+++ b/tests/auto/declarative/repeater/repeater.pro
@@ -0,0 +1,6 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_repeater.cpp
+
+# Define SRCDIR equal to test's source directory
+DEFINES += SRCDIR=\\\"$$PWD\\\"
diff --git a/tests/auto/declarative/repeater/tst_repeater.cpp b/tests/auto/declarative/repeater/tst_repeater.cpp
new file mode 100644
index 0000000..cdf1716
--- /dev/null
+++ b/tests/auto/declarative/repeater/tst_repeater.cpp
@@ -0,0 +1,91 @@
+#include <QtTest/QtTest>
+#include <qlistmodelinterface.h>
+#include <qfxview.h>
+#include <qfxrepeater.h>
+#include <qfxtext.h>
+#include <qmlcontext.h>
+
+class tst_QFxRepeater : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QFxRepeater();
+
+private slots:
+ void stringList();
+
+private:
+ QFxView *createView(const QString &filename);
+ template<typename T>
+ T *findItem(QFxItem *parent, const QString &id);
+};
+
+tst_QFxRepeater::tst_QFxRepeater()
+{
+}
+
+void tst_QFxRepeater::stringList()
+{
+ QFxView *canvas = createView(SRCDIR "/data/repeater.xml");
+
+ QStringList data;
+ data << "One";
+ data << "Two";
+ data << "Three";
+ data << "Four";
+
+ QmlContext *ctxt = canvas->rootContext();
+ ctxt->setProperty("testData", data);
+
+ canvas->execute();
+ qApp->processEvents();
+
+ QFxRepeater *repeater = findItem<QFxRepeater>(canvas->root(), "repeater");
+ QVERIFY(repeater != 0);
+
+ QFxItem *container = findItem<QFxItem>(canvas->root(), "container");
+ QVERIFY(container != 0);
+
+ QCOMPARE(container->children()->count(), data.count() + 1);
+
+ for (int i = 1; i < container->children()->count(); ++i) {
+ QFxText *name = qobject_cast<QFxText*>(container->children()->at(i));
+ QVERIFY(name != 0);
+ QCOMPARE(name->text(), data.at(i-1));
+ }
+
+ delete canvas;
+}
+
+
+QFxView *tst_QFxRepeater::createView(const QString &filename)
+{
+ QFxView *canvas = new QFxView(0);
+ canvas->setFixedSize(240,320);
+
+ QFile file(filename);
+ file.open(QFile::ReadOnly);
+ QString xml = file.readAll();
+ canvas->setXml(xml, filename);
+
+ return canvas;
+}
+
+template<typename T>
+T *tst_QFxRepeater::findItem(QFxItem *parent, const QString &id)
+{
+ const QMetaObject &mo = T::staticMetaObject;
+ if (mo.cast(parent) && (id.isEmpty() || parent->id() == id))
+ return static_cast<T*>(parent);
+ for (int i = 0; i < parent->children()->count(); ++i) {
+ QFxItem *item = findItem<T>(parent->children()->at(i), id);
+ if (item)
+ return static_cast<T*>(item);
+ }
+
+ return 0;
+}
+
+QTEST_MAIN(tst_QFxRepeater)
+
+#include "tst_repeater.moc"
diff --git a/tests/auto/declarative/simplecanvasitem/data/test.xml b/tests/auto/declarative/simplecanvasitem/data/test.xml
new file mode 100644
index 0000000..9b8f10a
--- /dev/null
+++ b/tests/auto/declarative/simplecanvasitem/data/test.xml
@@ -0,0 +1,12 @@
+<Item width="320" height="480">
+ <Rect color="blue" x="20" y="20" width="20" height="20">
+ <Rect color="black" x="20" y="20" width="10" height="10"/>
+ </Rect>
+ <Rect color="red" x="40" y="20" width="20" height="20"/>
+ <Rect color="green" x="60" y="20" width="20" height="20"/>
+ <Rect color="yellow" x="20" y="40" width="20" height="20"/>
+ <Rect color="purple" x="20" y="60" width="20" height="20"/>
+ <Rect color="white" x="40" y="40" width="20" height="20"/>
+ <Rect anchors.fill="{parent}" color="gray" z="-1"/>
+</Item>
+
diff --git a/tests/auto/declarative/simplecanvasitem/simplecanvasitem.pro b/tests/auto/declarative/simplecanvasitem/simplecanvasitem.pro
new file mode 100644
index 0000000..114be8e
--- /dev/null
+++ b/tests/auto/declarative/simplecanvasitem/simplecanvasitem.pro
@@ -0,0 +1,6 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_simplecanvasitem.cpp
+
+# Define SRCDIR equal to test's source directory
+DEFINES += SRCDIR=\\\"$$PWD\\\"
diff --git a/tests/auto/declarative/simplecanvasitem/tst_simplecanvasitem.cpp b/tests/auto/declarative/simplecanvasitem/tst_simplecanvasitem.cpp
new file mode 100644
index 0000000..47608a0
--- /dev/null
+++ b/tests/auto/declarative/simplecanvasitem/tst_simplecanvasitem.cpp
@@ -0,0 +1,79 @@
+#include <QtTest/QtTest>
+#include <qfxview.h>
+#include <qfxitem.h>
+#include <qsimplecanvasitem.h>
+
+/*
+ Note: this autotest is specifically to test SimpleCanvasItem as a component of
+ Qt Declarative, and therefore will have all items created in XML.
+*/
+class tst_SimpleCanvasItem : public QObject
+{
+ Q_OBJECT
+public:
+ tst_SimpleCanvasItem();
+
+private slots:
+ void test_pos();
+ void test_scenePos();
+private:
+ QFxView *createView(const QString &filename);
+};
+
+tst_SimpleCanvasItem::tst_SimpleCanvasItem()
+{
+}
+
+void tst_SimpleCanvasItem::test_pos()
+{
+ QFxView *canvas = createView(SRCDIR "/data/test.xml");
+ canvas->execute();
+ qApp->processEvents();
+ QSimpleCanvasItem* root = qobject_cast<QSimpleCanvasItem*>(canvas->root());
+ QVERIFY(root);
+
+ QCOMPARE(root->pos(), QPointF(0,0));
+ QCOMPARE(root->children().at(0)->pos(), QPointF(20,20));
+ QCOMPARE(root->children().at(0)->children().at(0)->pos(), QPointF(20,20));
+ QCOMPARE(root->children().at(2)->pos(), QPointF(60,20));
+ QCOMPARE(root->children().at(3)->pos(), QPointF(20,40));
+ QCOMPARE(root->children().at(5)->pos(), QPointF(40,40));
+}
+
+void tst_SimpleCanvasItem::test_scenePos()
+{
+ QFxView *canvas = createView(SRCDIR "/data/test.xml");
+ canvas->execute();
+ qApp->processEvents();
+ QSimpleCanvasItem* root = qobject_cast<QSimpleCanvasItem*>(canvas->root());
+ QVERIFY(root);
+
+#ifdef CANVAS_GL
+ QCOMPARE(root->transform(), QMatrix4x4());
+#else
+ QCOMPARE(root->transform(), QTransform());
+#endif
+ QCOMPARE(root->scenePos(), QPointF(0,0));
+ QCOMPARE(root->children().at(0)->scenePos(), QPointF(20,20));
+ QCOMPARE(root->children().at(0)->children().at(0)->scenePos(), QPointF(40,40));
+ QCOMPARE(root->children().at(2)->scenePos(), QPointF(60,20));
+ QCOMPARE(root->children().at(3)->scenePos(), QPointF(20,40));
+ QCOMPARE(root->children().at(5)->scenePos(), QPointF(40,40));
+}
+
+QFxView *tst_SimpleCanvasItem::createView(const QString &filename)
+{
+ QFxView *canvas = new QFxView(0);
+ canvas->setFixedSize(240,320);
+
+ QFile file(filename);
+ file.open(QFile::ReadOnly);
+ QString xml = file.readAll();
+ canvas->setXml(xml, filename);
+
+ return canvas;
+}
+
+QTEST_MAIN(tst_SimpleCanvasItem)
+
+#include "tst_simplecanvasitem.moc"
diff --git a/tests/auto/declarative/visual/ListView/basic1/basic1.xml b/tests/auto/declarative/visual/ListView/basic1/basic1.xml
new file mode 100644
index 0000000..5038c0a
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic1/basic1.xml
@@ -0,0 +1,19 @@
+<Rect color="blue" width="800" height="600" id="Page">
+ <ListView anchors.fill="{parent}">
+ <delegate>
+ <Rect color="red" width="100" height="100">
+ <Text text="{name}" />
+ </Rect>
+ </delegate>
+ <model>
+ <ListModel>
+ <Month>
+ <name>January</name>
+ </Month>
+ <Month>
+ <name>February</name>
+ </Month>
+ </ListModel>
+ </model>
+ </ListView>
+</Rect>
diff --git a/tests/auto/declarative/visual/ListView/basic1/data/opengl/image0.png b/tests/auto/declarative/visual/ListView/basic1/data/opengl/image0.png
new file mode 100644
index 0000000..403b407
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic1/data/opengl/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/ListView/basic1/data/opengl/manifest.xml b/tests/auto/declarative/visual/ListView/basic1/data/opengl/manifest.xml
new file mode 100644
index 0000000..b784f42
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic1/data/opengl/manifest.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/ListView/basic1/test b/tests/auto/declarative/visual/ListView/basic1/test
new file mode 100644
index 0000000..62f0665
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic1/test
@@ -0,0 +1 @@
+basic1.xml
diff --git a/tests/auto/declarative/visual/ListView/basic2/basic2.xml b/tests/auto/declarative/visual/ListView/basic2/basic2.xml
new file mode 100644
index 0000000..5e139fe
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic2/basic2.xml
@@ -0,0 +1,20 @@
+<Rect color="blue" width="800" height="600" id="Page">
+ <Component id="Delegate">
+ <Rect color="red" width="100" height="100">
+ <Text text="{name}" />
+ </Rect>
+ </Component>
+
+ <ListView anchors.fill="{parent}" delegate="{Delegate}">
+ <model>
+ <ListModel>
+ <Month>
+ <name>January</name>
+ </Month>
+ <Month>
+ <name>February</name>
+ </Month>
+ </ListModel>
+ </model>
+ </ListView>
+</Rect>
diff --git a/tests/auto/declarative/visual/ListView/basic2/data/opengl/image0.png b/tests/auto/declarative/visual/ListView/basic2/data/opengl/image0.png
new file mode 100644
index 0000000..403b407
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic2/data/opengl/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/ListView/basic2/data/opengl/manifest.xml b/tests/auto/declarative/visual/ListView/basic2/data/opengl/manifest.xml
new file mode 100644
index 0000000..f3fa6c9
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic2/data/opengl/manifest.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="31" frameId="0"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/ListView/basic2/test b/tests/auto/declarative/visual/ListView/basic2/test
new file mode 100644
index 0000000..ae974fe
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic2/test
@@ -0,0 +1 @@
+basic2.xml
diff --git a/tests/auto/declarative/visual/ListView/basic3/basic3.xml b/tests/auto/declarative/visual/ListView/basic3/basic3.xml
new file mode 100644
index 0000000..a587b82
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic3/basic3.xml
@@ -0,0 +1,18 @@
+<Rect color="blue" width="800" height="600" id="Page">
+ <ListModel id="Model">
+ <Month>
+ <name>January</name>
+ </Month>
+ <Month>
+ <name>February</name>
+ </Month>
+ </ListModel>
+
+ <ListView anchors.fill="{parent}" model="{Model}">
+ <delegate>
+ <Rect color="red" width="100" height="100">
+ <Text text="{name}" />
+ </Rect>
+ </delegate>
+ </ListView>
+</Rect>
diff --git a/tests/auto/declarative/visual/ListView/basic3/data/opengl/image0.png b/tests/auto/declarative/visual/ListView/basic3/data/opengl/image0.png
new file mode 100644
index 0000000..403b407
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic3/data/opengl/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/ListView/basic3/data/opengl/manifest.xml b/tests/auto/declarative/visual/ListView/basic3/data/opengl/manifest.xml
new file mode 100644
index 0000000..b784f42
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic3/data/opengl/manifest.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/ListView/basic3/test b/tests/auto/declarative/visual/ListView/basic3/test
new file mode 100644
index 0000000..ea3154e
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic3/test
@@ -0,0 +1 @@
+basic3.xml
diff --git a/tests/auto/declarative/visual/ListView/basic4/basic4.xml b/tests/auto/declarative/visual/ListView/basic4/basic4.xml
new file mode 100644
index 0000000..4b9201c
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic4/basic4.xml
@@ -0,0 +1,19 @@
+<Rect color="blue" width="800" height="600" id="Page">
+ <ListModel id="Model">
+ <Month>
+ <name>January</name>
+ </Month>
+ <Month>
+ <name>February</name>
+ </Month>
+ </ListModel>
+
+ <Component id="Delegate">
+ <Rect color="red" width="100" height="100">
+ <Text text="{name}" />
+ </Rect>
+ </Component>
+
+ <ListView anchors.fill="{parent}" model="{Model}" delegate="{Delegate}">
+ </ListView>
+</Rect>
diff --git a/tests/auto/declarative/visual/ListView/basic4/data/opengl/image0.png b/tests/auto/declarative/visual/ListView/basic4/data/opengl/image0.png
new file mode 100644
index 0000000..403b407
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic4/data/opengl/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/ListView/basic4/data/opengl/manifest.xml b/tests/auto/declarative/visual/ListView/basic4/data/opengl/manifest.xml
new file mode 100644
index 0000000..b784f42
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic4/data/opengl/manifest.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/ListView/basic4/test b/tests/auto/declarative/visual/ListView/basic4/test
new file mode 100644
index 0000000..891e0be
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/basic4/test
@@ -0,0 +1 @@
+basic4.xml
diff --git a/tests/auto/declarative/visual/bindinganimation/bindinganimation.xml b/tests/auto/declarative/visual/bindinganimation/bindinganimation.xml
new file mode 100644
index 0000000..30b0b6a
--- /dev/null
+++ b/tests/auto/declarative/visual/bindinganimation/bindinganimation.xml
@@ -0,0 +1,19 @@
+<Rect color="blue" width="320" height="240" id="Page">
+ <Rect id="MyRect" width="100" height="100" color="red" x="{10}" />
+
+ <states>
+ <State name="hello">
+ <SetProperty target="{MyRect}" property="x" binding="100" />
+ <SetProperty target="{MyMouseRegion}" property="onClick" value="Page.currentState = ''" />
+ </State>
+ </states>
+
+ <transitions>
+ <Transition>
+ <NumericAnimation properties="x" />
+ </Transition>
+ </transitions>
+
+ <MouseRegion id="MyMouseRegion" anchors.fill="{parent}" onClick="Page.currentState= 'hello'" />
+
+</Rect>
diff --git a/tests/auto/declarative/visual/bindinganimation/data/opengl/image0.png b/tests/auto/declarative/visual/bindinganimation/data/opengl/image0.png
new file mode 100644
index 0000000..2cda3fa
--- /dev/null
+++ b/tests/auto/declarative/visual/bindinganimation/data/opengl/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/bindinganimation/data/opengl/manifest-play.xml b/tests/auto/declarative/visual/bindinganimation/data/opengl/manifest-play.xml
new file mode 100644
index 0000000..6c5856f
--- /dev/null
+++ b/tests/auto/declarative/visual/bindinganimation/data/opengl/manifest-play.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+ <TestMouse time="1770" type="2" button="1" buttons="1" globalPos="614,528" pos="175,131"/>
+ <TestMouse time="1860" type="3" button="1" buttons="0" globalPos="614,528" pos="175,131"/>
+ <TestFrame time="1860" hash="7CB5FC371040E587DE9F06CE14A4B29A"/>
+ <TestFrame time="1920" hash="8F88EE8780C32F038C9ACDC7172DE04E"/>
+ <TestFrame time="1950" hash="BE859D598C5DB953A8FC506DED4940EB"/>
+ <TestFrame time="1980" hash="16FE17B15900FF0464AB20EA921E5B1F"/>
+ <TestFrame time="2010" hash="FCB17070EF24575C61046928A8BBE440"/>
+ <TestFrame time="2040" hash="4F58226BDBDA7339D972ECA065F75766"/>
+ <TestFrame time="2070" hash="D9AF30557F99B086BB1A185A946B580D"/>
+ <TestFrame time="2100" hash="082E0E7650D187A54EF0948CCCA98E5A"/>
+ <TestFrame time="2130" hash="4F41101378A104E72228EEB4BA395CA8"/>
+ <TestFrame time="2160" hash="3223ED179C828FADB3ECA9C6373176C1"/>
+ <TestFrame time="2190" hash="DAFCCE427161A70C3513841AC22AEA00"/>
+ <TestFrame time="2220" hash="7F465A99FCA50503736E470A0B4E1C7A"/>
+ <TestFrame time="2250" hash="97542160B249135B1F3957DBBB329C2E"/>
+ <TestFrame time="2280" hash="F9F74A2E38B52C9266F33E428B6ACD9D"/>
+ <TestFrame time="2310" hash="65AD7E0189C096792331BD1BB0DAF0DB"/>
+ <TestFrame time="2340" hash="BA403842BA3128B1CDF6A9CB28C90751"/>
+ <TestFrame time="2370" hash="1BCDCD0E8166D69F4349E05D5E92FD9D"/>
+ <TestFrame time="2400" hash="383BA6B9EFCC58FCA512982A207631F6"/>
+ <TestMouse time="2820" type="2" button="1" buttons="1" globalPos="614,528" pos="175,131"/>
+ <TestMouse time="2910" type="3" button="1" buttons="0" globalPos="614,528" pos="175,131"/>
+ <TestFrame time="2910" hash="383BA6B9EFCC58FCA512982A207631F6"/>
+ <TestFrame time="2970" hash="ADC501A3A2B8AAF72F58BA985B57424E"/>
+ <TestFrame time="3000" hash="BFA51B7C19753EF7B16D78AFFFC7B9DD"/>
+ <TestFrame time="3030" hash="A93F930EC8528F954CD4A770C9A8171B"/>
+ <TestFrame time="3060" hash="0B0C6419E1E5B016D9C22BD98FD452B1"/>
+ <TestFrame time="3090" hash="1D5CD86AB732DA3705A7BB1DEAB77923"/>
+ <TestFrame time="3120" hash="69058485CED6BC992A1A7C5EE34ADD4C"/>
+ <TestFrame time="3150" hash="72731478D80F024076EA639B55152360"/>
+ <TestFrame time="3180" hash="37739777A5979F3EBF85E47E63341660"/>
+ <TestFrame time="3210" hash="FCAE0317F81A3DDD713F4DB1349A9DA0"/>
+ <TestFrame time="3240" hash="82363265ED2B611A54F8D48B2AF22F11"/>
+ <TestFrame time="3270" hash="5FAE0BDC65C609CB766CE585B8C649DB"/>
+ <TestFrame time="3300" hash="2D21B4AF3780EF2BBCCFCEC957CE49C8"/>
+ <TestFrame time="3330" hash="4AB21E266919FB8D340F87091D8E1F62"/>
+ <TestFrame time="3360" hash="5F5DA43901938FA244F536336FFD2DFC"/>
+ <TestFrame time="3390" hash="9B7685F5933C5E06883EE4D1BB2BD2C6"/>
+ <TestFrame time="3420" hash="96C077E3A572EDFF04FA9B2F7020FFD0"/>
+ <TestFrame time="3450" hash="7CB5FC371040E587DE9F06CE14A4B29A"/>
+ <TestMouse time="3840" type="2" button="1" buttons="1" globalPos="614,528" pos="175,131"/>
+ <TestMouse time="3930" type="3" button="1" buttons="0" globalPos="614,528" pos="175,131"/>
+ <TestFrame time="3930" hash="7CB5FC371040E587DE9F06CE14A4B29A"/>
+ <TestFrame time="3990" hash="8F88EE8780C32F038C9ACDC7172DE04E"/>
+ <TestFrame time="4020" hash="BE859D598C5DB953A8FC506DED4940EB"/>
+ <TestFrame time="4050" hash="16FE17B15900FF0464AB20EA921E5B1F"/>
+ <TestFrame time="4080" hash="FCB17070EF24575C61046928A8BBE440"/>
+ <TestFrame time="4110" hash="4F58226BDBDA7339D972ECA065F75766"/>
+ <TestFrame time="4140" hash="D9AF30557F99B086BB1A185A946B580D"/>
+ <TestFrame time="4170" hash="082E0E7650D187A54EF0948CCCA98E5A"/>
+ <TestFrame time="4200" hash="4F41101378A104E72228EEB4BA395CA8"/>
+ <TestFrame time="4230" hash="3223ED179C828FADB3ECA9C6373176C1"/>
+ <TestFrame time="4260" hash="DAFCCE427161A70C3513841AC22AEA00"/>
+ <TestFrame time="4290" hash="7F465A99FCA50503736E470A0B4E1C7A"/>
+ <TestFrame time="4320" hash="97542160B249135B1F3957DBBB329C2E"/>
+ <TestFrame time="4350" hash="F9F74A2E38B52C9266F33E428B6ACD9D"/>
+ <TestFrame time="4380" hash="65AD7E0189C096792331BD1BB0DAF0DB"/>
+ <TestFrame time="4410" hash="BA403842BA3128B1CDF6A9CB28C90751"/>
+ <TestFrame time="4440" hash="1BCDCD0E8166D69F4349E05D5E92FD9D"/>
+ <TestFrame time="4470" hash="383BA6B9EFCC58FCA512982A207631F6"/>
+ <TestMouse time="4920" type="2" button="1" buttons="1" globalPos="614,528" pos="175,131"/>
+ <TestMouse time="5010" type="3" button="1" buttons="0" globalPos="614,528" pos="175,131"/>
+ <TestFrame time="5010" hash="383BA6B9EFCC58FCA512982A207631F6"/>
+ <TestFrame time="5070" hash="ADC501A3A2B8AAF72F58BA985B57424E"/>
+ <TestFrame time="5100" hash="BFA51B7C19753EF7B16D78AFFFC7B9DD"/>
+ <TestFrame time="5130" hash="A93F930EC8528F954CD4A770C9A8171B"/>
+ <TestFrame time="5160" hash="0B0C6419E1E5B016D9C22BD98FD452B1"/>
+ <TestFrame time="5190" hash="1D5CD86AB732DA3705A7BB1DEAB77923"/>
+ <TestFrame time="5220" hash="69058485CED6BC992A1A7C5EE34ADD4C"/>
+ <TestFrame time="5250" hash="72731478D80F024076EA639B55152360"/>
+ <TestFrame time="5280" hash="37739777A5979F3EBF85E47E63341660"/>
+ <TestFrame time="5310" hash="FCAE0317F81A3DDD713F4DB1349A9DA0"/>
+ <TestFrame time="5340" hash="82363265ED2B611A54F8D48B2AF22F11"/>
+ <TestFrame time="5370" hash="5FAE0BDC65C609CB766CE585B8C649DB"/>
+ <TestFrame time="5400" hash="2D21B4AF3780EF2BBCCFCEC957CE49C8"/>
+ <TestFrame time="5430" hash="4AB21E266919FB8D340F87091D8E1F62"/>
+ <TestFrame time="5460" hash="5F5DA43901938FA244F536336FFD2DFC"/>
+ <TestFrame time="5490" hash="9B7685F5933C5E06883EE4D1BB2BD2C6"/>
+ <TestFrame time="5520" hash="96C077E3A572EDFF04FA9B2F7020FFD0"/>
+ <TestFrame time="5550" hash="7CB5FC371040E587DE9F06CE14A4B29A"/>
+ <TestMouse time="5910" type="2" button="1" buttons="1" globalPos="614,528" pos="175,131"/>
+ <TestMouse time="6030" type="3" button="1" buttons="0" globalPos="614,528" pos="175,131"/>
+ <TestFrame time="6030" hash="7CB5FC371040E587DE9F06CE14A4B29A"/>
+ <TestFrame time="6090" hash="8F88EE8780C32F038C9ACDC7172DE04E"/>
+ <TestFrame time="6120" hash="BE859D598C5DB953A8FC506DED4940EB"/>
+ <TestFrame time="6150" hash="16FE17B15900FF0464AB20EA921E5B1F"/>
+ <TestFrame time="6180" hash="FCB17070EF24575C61046928A8BBE440"/>
+ <TestFrame time="6210" hash="4F58226BDBDA7339D972ECA065F75766"/>
+ <TestFrame time="6240" hash="D9AF30557F99B086BB1A185A946B580D"/>
+ <TestFrame time="6270" hash="082E0E7650D187A54EF0948CCCA98E5A"/>
+ <TestFrame time="6300" hash="4F41101378A104E72228EEB4BA395CA8"/>
+ <TestFrame time="6330" hash="3223ED179C828FADB3ECA9C6373176C1"/>
+ <TestFrame time="6360" hash="DAFCCE427161A70C3513841AC22AEA00"/>
+ <TestFrame time="6390" hash="7F465A99FCA50503736E470A0B4E1C7A"/>
+ <TestFrame time="6420" hash="97542160B249135B1F3957DBBB329C2E"/>
+ <TestFrame time="6450" hash="F9F74A2E38B52C9266F33E428B6ACD9D"/>
+ <TestFrame time="6480" hash="65AD7E0189C096792331BD1BB0DAF0DB"/>
+ <TestFrame time="6510" hash="BA403842BA3128B1CDF6A9CB28C90751"/>
+ <TestFrame time="6540" hash="1BCDCD0E8166D69F4349E05D5E92FD9D"/>
+ <TestFrame time="6570" hash="383BA6B9EFCC58FCA512982A207631F6"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/bindinganimation/data/opengl/manifest.xml b/tests/auto/declarative/visual/bindinganimation/data/opengl/manifest.xml
new file mode 100644
index 0000000..6c5856f
--- /dev/null
+++ b/tests/auto/declarative/visual/bindinganimation/data/opengl/manifest.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+ <TestMouse time="1770" type="2" button="1" buttons="1" globalPos="614,528" pos="175,131"/>
+ <TestMouse time="1860" type="3" button="1" buttons="0" globalPos="614,528" pos="175,131"/>
+ <TestFrame time="1860" hash="7CB5FC371040E587DE9F06CE14A4B29A"/>
+ <TestFrame time="1920" hash="8F88EE8780C32F038C9ACDC7172DE04E"/>
+ <TestFrame time="1950" hash="BE859D598C5DB953A8FC506DED4940EB"/>
+ <TestFrame time="1980" hash="16FE17B15900FF0464AB20EA921E5B1F"/>
+ <TestFrame time="2010" hash="FCB17070EF24575C61046928A8BBE440"/>
+ <TestFrame time="2040" hash="4F58226BDBDA7339D972ECA065F75766"/>
+ <TestFrame time="2070" hash="D9AF30557F99B086BB1A185A946B580D"/>
+ <TestFrame time="2100" hash="082E0E7650D187A54EF0948CCCA98E5A"/>
+ <TestFrame time="2130" hash="4F41101378A104E72228EEB4BA395CA8"/>
+ <TestFrame time="2160" hash="3223ED179C828FADB3ECA9C6373176C1"/>
+ <TestFrame time="2190" hash="DAFCCE427161A70C3513841AC22AEA00"/>
+ <TestFrame time="2220" hash="7F465A99FCA50503736E470A0B4E1C7A"/>
+ <TestFrame time="2250" hash="97542160B249135B1F3957DBBB329C2E"/>
+ <TestFrame time="2280" hash="F9F74A2E38B52C9266F33E428B6ACD9D"/>
+ <TestFrame time="2310" hash="65AD7E0189C096792331BD1BB0DAF0DB"/>
+ <TestFrame time="2340" hash="BA403842BA3128B1CDF6A9CB28C90751"/>
+ <TestFrame time="2370" hash="1BCDCD0E8166D69F4349E05D5E92FD9D"/>
+ <TestFrame time="2400" hash="383BA6B9EFCC58FCA512982A207631F6"/>
+ <TestMouse time="2820" type="2" button="1" buttons="1" globalPos="614,528" pos="175,131"/>
+ <TestMouse time="2910" type="3" button="1" buttons="0" globalPos="614,528" pos="175,131"/>
+ <TestFrame time="2910" hash="383BA6B9EFCC58FCA512982A207631F6"/>
+ <TestFrame time="2970" hash="ADC501A3A2B8AAF72F58BA985B57424E"/>
+ <TestFrame time="3000" hash="BFA51B7C19753EF7B16D78AFFFC7B9DD"/>
+ <TestFrame time="3030" hash="A93F930EC8528F954CD4A770C9A8171B"/>
+ <TestFrame time="3060" hash="0B0C6419E1E5B016D9C22BD98FD452B1"/>
+ <TestFrame time="3090" hash="1D5CD86AB732DA3705A7BB1DEAB77923"/>
+ <TestFrame time="3120" hash="69058485CED6BC992A1A7C5EE34ADD4C"/>
+ <TestFrame time="3150" hash="72731478D80F024076EA639B55152360"/>
+ <TestFrame time="3180" hash="37739777A5979F3EBF85E47E63341660"/>
+ <TestFrame time="3210" hash="FCAE0317F81A3DDD713F4DB1349A9DA0"/>
+ <TestFrame time="3240" hash="82363265ED2B611A54F8D48B2AF22F11"/>
+ <TestFrame time="3270" hash="5FAE0BDC65C609CB766CE585B8C649DB"/>
+ <TestFrame time="3300" hash="2D21B4AF3780EF2BBCCFCEC957CE49C8"/>
+ <TestFrame time="3330" hash="4AB21E266919FB8D340F87091D8E1F62"/>
+ <TestFrame time="3360" hash="5F5DA43901938FA244F536336FFD2DFC"/>
+ <TestFrame time="3390" hash="9B7685F5933C5E06883EE4D1BB2BD2C6"/>
+ <TestFrame time="3420" hash="96C077E3A572EDFF04FA9B2F7020FFD0"/>
+ <TestFrame time="3450" hash="7CB5FC371040E587DE9F06CE14A4B29A"/>
+ <TestMouse time="3840" type="2" button="1" buttons="1" globalPos="614,528" pos="175,131"/>
+ <TestMouse time="3930" type="3" button="1" buttons="0" globalPos="614,528" pos="175,131"/>
+ <TestFrame time="3930" hash="7CB5FC371040E587DE9F06CE14A4B29A"/>
+ <TestFrame time="3990" hash="8F88EE8780C32F038C9ACDC7172DE04E"/>
+ <TestFrame time="4020" hash="BE859D598C5DB953A8FC506DED4940EB"/>
+ <TestFrame time="4050" hash="16FE17B15900FF0464AB20EA921E5B1F"/>
+ <TestFrame time="4080" hash="FCB17070EF24575C61046928A8BBE440"/>
+ <TestFrame time="4110" hash="4F58226BDBDA7339D972ECA065F75766"/>
+ <TestFrame time="4140" hash="D9AF30557F99B086BB1A185A946B580D"/>
+ <TestFrame time="4170" hash="082E0E7650D187A54EF0948CCCA98E5A"/>
+ <TestFrame time="4200" hash="4F41101378A104E72228EEB4BA395CA8"/>
+ <TestFrame time="4230" hash="3223ED179C828FADB3ECA9C6373176C1"/>
+ <TestFrame time="4260" hash="DAFCCE427161A70C3513841AC22AEA00"/>
+ <TestFrame time="4290" hash="7F465A99FCA50503736E470A0B4E1C7A"/>
+ <TestFrame time="4320" hash="97542160B249135B1F3957DBBB329C2E"/>
+ <TestFrame time="4350" hash="F9F74A2E38B52C9266F33E428B6ACD9D"/>
+ <TestFrame time="4380" hash="65AD7E0189C096792331BD1BB0DAF0DB"/>
+ <TestFrame time="4410" hash="BA403842BA3128B1CDF6A9CB28C90751"/>
+ <TestFrame time="4440" hash="1BCDCD0E8166D69F4349E05D5E92FD9D"/>
+ <TestFrame time="4470" hash="383BA6B9EFCC58FCA512982A207631F6"/>
+ <TestMouse time="4920" type="2" button="1" buttons="1" globalPos="614,528" pos="175,131"/>
+ <TestMouse time="5010" type="3" button="1" buttons="0" globalPos="614,528" pos="175,131"/>
+ <TestFrame time="5010" hash="383BA6B9EFCC58FCA512982A207631F6"/>
+ <TestFrame time="5070" hash="ADC501A3A2B8AAF72F58BA985B57424E"/>
+ <TestFrame time="5100" hash="BFA51B7C19753EF7B16D78AFFFC7B9DD"/>
+ <TestFrame time="5130" hash="A93F930EC8528F954CD4A770C9A8171B"/>
+ <TestFrame time="5160" hash="0B0C6419E1E5B016D9C22BD98FD452B1"/>
+ <TestFrame time="5190" hash="1D5CD86AB732DA3705A7BB1DEAB77923"/>
+ <TestFrame time="5220" hash="69058485CED6BC992A1A7C5EE34ADD4C"/>
+ <TestFrame time="5250" hash="72731478D80F024076EA639B55152360"/>
+ <TestFrame time="5280" hash="37739777A5979F3EBF85E47E63341660"/>
+ <TestFrame time="5310" hash="FCAE0317F81A3DDD713F4DB1349A9DA0"/>
+ <TestFrame time="5340" hash="82363265ED2B611A54F8D48B2AF22F11"/>
+ <TestFrame time="5370" hash="5FAE0BDC65C609CB766CE585B8C649DB"/>
+ <TestFrame time="5400" hash="2D21B4AF3780EF2BBCCFCEC957CE49C8"/>
+ <TestFrame time="5430" hash="4AB21E266919FB8D340F87091D8E1F62"/>
+ <TestFrame time="5460" hash="5F5DA43901938FA244F536336FFD2DFC"/>
+ <TestFrame time="5490" hash="9B7685F5933C5E06883EE4D1BB2BD2C6"/>
+ <TestFrame time="5520" hash="96C077E3A572EDFF04FA9B2F7020FFD0"/>
+ <TestFrame time="5550" hash="7CB5FC371040E587DE9F06CE14A4B29A"/>
+ <TestMouse time="5910" type="2" button="1" buttons="1" globalPos="614,528" pos="175,131"/>
+ <TestMouse time="6030" type="3" button="1" buttons="0" globalPos="614,528" pos="175,131"/>
+ <TestFrame time="6030" hash="7CB5FC371040E587DE9F06CE14A4B29A"/>
+ <TestFrame time="6090" hash="8F88EE8780C32F038C9ACDC7172DE04E"/>
+ <TestFrame time="6120" hash="BE859D598C5DB953A8FC506DED4940EB"/>
+ <TestFrame time="6150" hash="16FE17B15900FF0464AB20EA921E5B1F"/>
+ <TestFrame time="6180" hash="FCB17070EF24575C61046928A8BBE440"/>
+ <TestFrame time="6210" hash="4F58226BDBDA7339D972ECA065F75766"/>
+ <TestFrame time="6240" hash="D9AF30557F99B086BB1A185A946B580D"/>
+ <TestFrame time="6270" hash="082E0E7650D187A54EF0948CCCA98E5A"/>
+ <TestFrame time="6300" hash="4F41101378A104E72228EEB4BA395CA8"/>
+ <TestFrame time="6330" hash="3223ED179C828FADB3ECA9C6373176C1"/>
+ <TestFrame time="6360" hash="DAFCCE427161A70C3513841AC22AEA00"/>
+ <TestFrame time="6390" hash="7F465A99FCA50503736E470A0B4E1C7A"/>
+ <TestFrame time="6420" hash="97542160B249135B1F3957DBBB329C2E"/>
+ <TestFrame time="6450" hash="F9F74A2E38B52C9266F33E428B6ACD9D"/>
+ <TestFrame time="6480" hash="65AD7E0189C096792331BD1BB0DAF0DB"/>
+ <TestFrame time="6510" hash="BA403842BA3128B1CDF6A9CB28C90751"/>
+ <TestFrame time="6540" hash="1BCDCD0E8166D69F4349E05D5E92FD9D"/>
+ <TestFrame time="6570" hash="383BA6B9EFCC58FCA512982A207631F6"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/bindinganimation/test b/tests/auto/declarative/visual/bindinganimation/test
new file mode 100644
index 0000000..964c489
--- /dev/null
+++ b/tests/auto/declarative/visual/bindinganimation/test
@@ -0,0 +1 @@
+bindinganimation.xml
diff --git a/tests/auto/declarative/visual/colorAnimation/colorAnimation.xml b/tests/auto/declarative/visual/colorAnimation/colorAnimation.xml
new file mode 100644
index 0000000..39d08be
--- /dev/null
+++ b/tests/auto/declarative/visual/colorAnimation/colorAnimation.xml
@@ -0,0 +1,18 @@
+<Rect id="mainrect" currentState="first">
+<states>
+ <State name="first">
+ <SetProperty target="{mainrect}" property="color" value="red"/>
+ </State>
+ <State name="second" >
+ <SetProperty target="{mainrect}" property="color" value="blue"/>
+ </State>
+</states>
+<transitions>
+ <Transition fromState="first" toState="second" reversible="true" >
+ <SerialAnimation>
+ <ColorAnimation duration="2000" target="{mainrect}" property="color" />
+ </SerialAnimation>
+ </Transition>
+</transitions>
+<MouseRegion anchors.fill="{parent}" onClick="mainrect.currentState = 'second'" />
+</Rect>
diff --git a/tests/auto/declarative/visual/colorAnimation/image0.png b/tests/auto/declarative/visual/colorAnimation/image0.png
new file mode 100644
index 0000000..9e1caf7
--- /dev/null
+++ b/tests/auto/declarative/visual/colorAnimation/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/colorAnimation/manifest-play.xml b/tests/auto/declarative/visual/colorAnimation/manifest-play.xml
new file mode 100644
index 0000000..8e3de2e
--- /dev/null
+++ b/tests/auto/declarative/visual/colorAnimation/manifest-play.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+ <TestMouse time="480" type="2" button="1" buttons="1" globalPos="93,129" pos="89,102"/>
+ <TestMouse time="570" type="3" button="1" buttons="0" globalPos="93,129" pos="89,102"/>
+ <TestFrame time="630" hash="D42762ECD293C6922C5F9593126DE636"/>
+ <TestFrame time="660" hash="8962505FCCB2E7559A99A8EDD325A82B"/>
+ <TestFrame time="690" hash="6812EFDA80607D4FA05CD3A5077F8EF7"/>
+ <TestFrame time="720" hash="A116DF73809679C1C5F9261F49B989F0"/>
+ <TestFrame time="750" hash="DC1B9D40AEE306171AD6625DDCA4EB45"/>
+ <TestFrame time="780" hash="B2DAF0E4C32080229664A8B0A155DE3B"/>
+ <TestFrame time="810" hash="496677B0D8707B91566D1244C46D50DB"/>
+ <TestFrame time="840" hash="A6558D8B0D1FB1D11BEBE36C078386CE"/>
+ <TestFrame time="870" hash="601436BB436D391B0BD5FCC289666208"/>
+ <TestFrame time="900" hash="8CF3CF9EAD875497870CC7C1035802DC"/>
+ <TestFrame time="930" hash="FF6BA6BAC30DADD3DBBFD96F127EB1FE"/>
+ <TestFrame time="960" hash="1D97A2A6890078DCF4CE9E508E5F9F08"/>
+ <TestFrame time="990" hash="58C9116FDDD03DD036820EFCD0DCD392"/>
+ <TestFrame time="1020" hash="E51287B911C140B41D350FCB2091AB80"/>
+ <TestFrame time="1050" hash="7B107411B436FABE469A069E6E5B0C3C"/>
+ <TestFrame time="1080" hash="9D1CB0E58F2BD00DDA0FB463F6BFF526"/>
+ <TestFrame time="1110" hash="35AB7788489B79E5A5C6F2BE11AFC9E1"/>
+ <TestFrame time="1140" hash="C82177AC4A7A497469292C5F0F8C4913"/>
+ <TestFrame time="1170" hash="18763D1B911FDC524DB9E7B2569FE984"/>
+ <TestFrame time="1200" hash="27F63572AAEF6D835272D5D65FCF608B"/>
+ <TestFrame time="1230" hash="585727CAEC1F83ADB9E422BAF058A622"/>
+ <TestFrame time="1260" hash="2C3BBFEFBE6E5FDA1905E9F50985E1B4"/>
+ <TestFrame time="1290" hash="81675C4ABB2696D960BC5F204F05F16B"/>
+ <TestFrame time="1320" hash="6D0F3CCC06EF1E3A895ECC9A8DE90039"/>
+ <TestFrame time="1350" hash="0BF36093CCAEA8BDAE96D4939A8DDE20"/>
+ <TestFrame time="1380" hash="5A1CBC68AB59977B65492B0F8A664418"/>
+ <TestFrame time="1410" hash="C35831A8C59D56193CED2C4AADB4DFCE"/>
+ <TestFrame time="1440" hash="ED15973425A8B8528896B344A61393AA"/>
+ <TestFrame time="1470" hash="EA8FC02A8606680C089F0C0CE454ABE3"/>
+ <TestFrame time="1500" hash="CFB5CFBA0A0BC62C0D03908FB9599A8E"/>
+ <TestFrame time="1530" hash="09FAA04AFB50B48BD6A83F9E25F9DDDB"/>
+ <TestFrame time="1560" hash="0FDD0B8CDCCEB78C7C67AB0F5EA74D6A"/>
+ <TestFrame time="1590" hash="058D26146879900B5E5CCE05AE38BA0E"/>
+ <TestFrame time="1620" hash="80F9074C50F967C99D4C3A3FF9EC3E71"/>
+ <TestFrame time="1650" hash="AD9BDCEEC1C058D6B658C5BA0D0BC1F0"/>
+ <TestFrame time="1680" hash="AC14DF5458F91001181154F8C68BCE2B"/>
+ <TestFrame time="1710" hash="AE9225263E4C8E75E4D0F1D7192B4260"/>
+ <TestFrame time="1740" hash="D3D50F1B7F476E79E5B99E0E6D4CF827"/>
+ <TestFrame time="1770" hash="A1367445C5232ACCBF4904A415416EA4"/>
+ <TestFrame time="1800" hash="A21C0F1DA9B64A5B000558BA1F2E495D"/>
+ <TestFrame time="1830" hash="61AF477B6FB22E38E698375EA5793D22"/>
+ <TestFrame time="1860" hash="B3AD3501D527939CEAA4F124AB10B2DF"/>
+ <TestFrame time="1890" hash="0C2BF65A43AE87AFB0068F9FA4A74707"/>
+ <TestFrame time="1920" hash="5B7F96C797BEE4FD1B04538DE5549C1B"/>
+ <TestFrame time="1950" hash="4C861E936A3F1AFE323395E30174F8CC"/>
+ <TestFrame time="1980" hash="87F1966E5B0E924EB7CEED5520D120BF"/>
+ <TestFrame time="2010" hash="1980755E0D80469D4DC0B9B0309F2DEB"/>
+ <TestFrame time="2040" hash="38A7ACC2E5607FC0965B7B376A0D3524"/>
+ <TestFrame time="2070" hash="4434746833EFF5A3A76491024763990A"/>
+ <TestFrame time="2100" hash="A8BAD928F92E851B45723068B7FEF739"/>
+ <TestFrame time="2130" hash="A96F5C522C0ECA5C78E982E4235218CB"/>
+ <TestFrame time="2160" hash="135F0EFEDE2832B76F49966EBD629879"/>
+ <TestFrame time="2190" hash="A51C6E443413F184CAAE8A7F98A369C8"/>
+ <TestFrame time="2220" hash="62A7521EE62E6A2543B3141C1EFCE72A"/>
+ <TestFrame time="2250" hash="D416A41125659167B3E6AD68F66F6E64"/>
+ <TestFrame time="2280" hash="0F653B5E965665A43F50437724DC704C"/>
+ <TestFrame time="2310" hash="13A6E2485179501FF3AA8BA91A5050B4"/>
+ <TestFrame time="2340" hash="9423475D3832FBABEC56B80FA9161020"/>
+ <TestFrame time="2370" hash="497B21108A6CB127DB066B32D06D992A"/>
+ <TestFrame time="2400" hash="22F01CB9B4F8FF01410566A61E281373"/>
+ <TestFrame time="2430" hash="A099640BC088E14E20585CB87FC5C6F1"/>
+ <TestFrame time="2460" hash="AC2954553C333EA1D524CE51CD35958A"/>
+ <TestFrame time="2490" hash="771E882CC788BECAA82E71E6FBAB150D"/>
+ <TestFrame time="2520" hash="42CEDA45D88A8D2B3DA5B749F4C3C1BF"/>
+ <TestFrame time="2550" hash="C6E1F91B917E47246E012D1B203E0DC2"/>
+ <TestFrame time="2580" hash="EFB3E57CF265B6E36AA4DF72771D119C"/>
+ <TestFrame time="2610" hash="657FC7FD496E5A2FC84F63930E0D1DE3"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/colorAnimation/manifest.xml b/tests/auto/declarative/visual/colorAnimation/manifest.xml
new file mode 100644
index 0000000..8e3de2e
--- /dev/null
+++ b/tests/auto/declarative/visual/colorAnimation/manifest.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+ <TestMouse time="480" type="2" button="1" buttons="1" globalPos="93,129" pos="89,102"/>
+ <TestMouse time="570" type="3" button="1" buttons="0" globalPos="93,129" pos="89,102"/>
+ <TestFrame time="630" hash="D42762ECD293C6922C5F9593126DE636"/>
+ <TestFrame time="660" hash="8962505FCCB2E7559A99A8EDD325A82B"/>
+ <TestFrame time="690" hash="6812EFDA80607D4FA05CD3A5077F8EF7"/>
+ <TestFrame time="720" hash="A116DF73809679C1C5F9261F49B989F0"/>
+ <TestFrame time="750" hash="DC1B9D40AEE306171AD6625DDCA4EB45"/>
+ <TestFrame time="780" hash="B2DAF0E4C32080229664A8B0A155DE3B"/>
+ <TestFrame time="810" hash="496677B0D8707B91566D1244C46D50DB"/>
+ <TestFrame time="840" hash="A6558D8B0D1FB1D11BEBE36C078386CE"/>
+ <TestFrame time="870" hash="601436BB436D391B0BD5FCC289666208"/>
+ <TestFrame time="900" hash="8CF3CF9EAD875497870CC7C1035802DC"/>
+ <TestFrame time="930" hash="FF6BA6BAC30DADD3DBBFD96F127EB1FE"/>
+ <TestFrame time="960" hash="1D97A2A6890078DCF4CE9E508E5F9F08"/>
+ <TestFrame time="990" hash="58C9116FDDD03DD036820EFCD0DCD392"/>
+ <TestFrame time="1020" hash="E51287B911C140B41D350FCB2091AB80"/>
+ <TestFrame time="1050" hash="7B107411B436FABE469A069E6E5B0C3C"/>
+ <TestFrame time="1080" hash="9D1CB0E58F2BD00DDA0FB463F6BFF526"/>
+ <TestFrame time="1110" hash="35AB7788489B79E5A5C6F2BE11AFC9E1"/>
+ <TestFrame time="1140" hash="C82177AC4A7A497469292C5F0F8C4913"/>
+ <TestFrame time="1170" hash="18763D1B911FDC524DB9E7B2569FE984"/>
+ <TestFrame time="1200" hash="27F63572AAEF6D835272D5D65FCF608B"/>
+ <TestFrame time="1230" hash="585727CAEC1F83ADB9E422BAF058A622"/>
+ <TestFrame time="1260" hash="2C3BBFEFBE6E5FDA1905E9F50985E1B4"/>
+ <TestFrame time="1290" hash="81675C4ABB2696D960BC5F204F05F16B"/>
+ <TestFrame time="1320" hash="6D0F3CCC06EF1E3A895ECC9A8DE90039"/>
+ <TestFrame time="1350" hash="0BF36093CCAEA8BDAE96D4939A8DDE20"/>
+ <TestFrame time="1380" hash="5A1CBC68AB59977B65492B0F8A664418"/>
+ <TestFrame time="1410" hash="C35831A8C59D56193CED2C4AADB4DFCE"/>
+ <TestFrame time="1440" hash="ED15973425A8B8528896B344A61393AA"/>
+ <TestFrame time="1470" hash="EA8FC02A8606680C089F0C0CE454ABE3"/>
+ <TestFrame time="1500" hash="CFB5CFBA0A0BC62C0D03908FB9599A8E"/>
+ <TestFrame time="1530" hash="09FAA04AFB50B48BD6A83F9E25F9DDDB"/>
+ <TestFrame time="1560" hash="0FDD0B8CDCCEB78C7C67AB0F5EA74D6A"/>
+ <TestFrame time="1590" hash="058D26146879900B5E5CCE05AE38BA0E"/>
+ <TestFrame time="1620" hash="80F9074C50F967C99D4C3A3FF9EC3E71"/>
+ <TestFrame time="1650" hash="AD9BDCEEC1C058D6B658C5BA0D0BC1F0"/>
+ <TestFrame time="1680" hash="AC14DF5458F91001181154F8C68BCE2B"/>
+ <TestFrame time="1710" hash="AE9225263E4C8E75E4D0F1D7192B4260"/>
+ <TestFrame time="1740" hash="D3D50F1B7F476E79E5B99E0E6D4CF827"/>
+ <TestFrame time="1770" hash="A1367445C5232ACCBF4904A415416EA4"/>
+ <TestFrame time="1800" hash="A21C0F1DA9B64A5B000558BA1F2E495D"/>
+ <TestFrame time="1830" hash="61AF477B6FB22E38E698375EA5793D22"/>
+ <TestFrame time="1860" hash="B3AD3501D527939CEAA4F124AB10B2DF"/>
+ <TestFrame time="1890" hash="0C2BF65A43AE87AFB0068F9FA4A74707"/>
+ <TestFrame time="1920" hash="5B7F96C797BEE4FD1B04538DE5549C1B"/>
+ <TestFrame time="1950" hash="4C861E936A3F1AFE323395E30174F8CC"/>
+ <TestFrame time="1980" hash="87F1966E5B0E924EB7CEED5520D120BF"/>
+ <TestFrame time="2010" hash="1980755E0D80469D4DC0B9B0309F2DEB"/>
+ <TestFrame time="2040" hash="38A7ACC2E5607FC0965B7B376A0D3524"/>
+ <TestFrame time="2070" hash="4434746833EFF5A3A76491024763990A"/>
+ <TestFrame time="2100" hash="A8BAD928F92E851B45723068B7FEF739"/>
+ <TestFrame time="2130" hash="A96F5C522C0ECA5C78E982E4235218CB"/>
+ <TestFrame time="2160" hash="135F0EFEDE2832B76F49966EBD629879"/>
+ <TestFrame time="2190" hash="A51C6E443413F184CAAE8A7F98A369C8"/>
+ <TestFrame time="2220" hash="62A7521EE62E6A2543B3141C1EFCE72A"/>
+ <TestFrame time="2250" hash="D416A41125659167B3E6AD68F66F6E64"/>
+ <TestFrame time="2280" hash="0F653B5E965665A43F50437724DC704C"/>
+ <TestFrame time="2310" hash="13A6E2485179501FF3AA8BA91A5050B4"/>
+ <TestFrame time="2340" hash="9423475D3832FBABEC56B80FA9161020"/>
+ <TestFrame time="2370" hash="497B21108A6CB127DB066B32D06D992A"/>
+ <TestFrame time="2400" hash="22F01CB9B4F8FF01410566A61E281373"/>
+ <TestFrame time="2430" hash="A099640BC088E14E20585CB87FC5C6F1"/>
+ <TestFrame time="2460" hash="AC2954553C333EA1D524CE51CD35958A"/>
+ <TestFrame time="2490" hash="771E882CC788BECAA82E71E6FBAB150D"/>
+ <TestFrame time="2520" hash="42CEDA45D88A8D2B3DA5B749F4C3C1BF"/>
+ <TestFrame time="2550" hash="C6E1F91B917E47246E012D1B203E0DC2"/>
+ <TestFrame time="2580" hash="EFB3E57CF265B6E36AA4DF72771D119C"/>
+ <TestFrame time="2610" hash="657FC7FD496E5A2FC84F63930E0D1DE3"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/easing/easing.xml b/tests/auto/declarative/visual/easing/easing.xml
new file mode 100644
index 0000000..01a7d6c
--- /dev/null
+++ b/tests/auto/declarative/visual/easing/easing.xml
@@ -0,0 +1,70 @@
+<Rect id="item" width="600" height="{layout.height}" color="white">
+ <resources>
+ <ListModel id="easingtypes">
+ <ListItem><type>easeNone</type></ListItem>
+ <ListItem><type>easeInQuad</type></ListItem>
+ <ListItem><type>easeOutQuad</type></ListItem>
+ <ListItem><type>easeInOutQuad</type></ListItem>
+ <ListItem><type>easeOutInQuad</type></ListItem>
+ <ListItem><type>easeInCubic</type></ListItem>
+ <ListItem><type>easeOutCubic</type></ListItem>
+ <ListItem><type>easeInOutCubic</type></ListItem>
+ <ListItem><type>easeOutInCubic</type></ListItem>
+ <ListItem><type>easeInQuart</type></ListItem>
+ <ListItem><type>easeOutQuart</type></ListItem>
+ <ListItem><type>easeInOutQuart</type></ListItem>
+ <ListItem><type>easeOutInQuart</type></ListItem>
+ <ListItem><type>easeInQuint</type></ListItem>
+ <ListItem><type>easeOutQuint</type></ListItem>
+ <ListItem><type>easeInOutQuint</type></ListItem>
+ <ListItem><type>easeOutInQuint</type></ListItem>
+ <ListItem><type>easeInSine</type></ListItem>
+ <ListItem><type>easeOutSine</type></ListItem>
+ <ListItem><type>easeInOutSine</type></ListItem>
+ <ListItem><type>easeOutInSine</type></ListItem>
+ <ListItem><type>easeInExpo</type></ListItem>
+ <ListItem><type>easeOutExpo</type></ListItem>
+ <ListItem><type>easeInOutExpo</type></ListItem>
+ <ListItem><type>easeOutInExpo</type></ListItem>
+ <ListItem><type>easeInCirc</type></ListItem>
+ <ListItem><type>easeOutCirc</type></ListItem>
+ <ListItem><type>easeInOutCirc</type></ListItem>
+ <ListItem><type>easeOutInCirc</type></ListItem>
+ <ListItem><type>easeInElastic</type></ListItem>
+ <ListItem><type>easeOutElastic</type></ListItem>
+ <ListItem><type>easeInOutElastic</type></ListItem>
+ <ListItem><type>easeOutInElastic</type></ListItem>
+ <ListItem><type>easeInBack</type></ListItem>
+ <ListItem><type>easeOutBack</type></ListItem>
+ <ListItem><type>easeInOutBack</type></ListItem>
+ <ListItem><type>easeOutInBack</type></ListItem>
+ <ListItem><type>easeOutBounce</type></ListItem>
+ <ListItem><type>easeInBounce</type></ListItem>
+ <ListItem><type>easeInOutBounce</type></ListItem>
+ <ListItem><type>easeOutInBounce</type></ListItem>
+ </ListModel>
+ </resources>
+
+ <VerticalLayout id="layout" anchors.left="{item.left}" anchors.right="{item.right}">
+ <Repeater dataSource="{easingtypes}" >
+ <Component>
+ <Text id="text" text="{type}" height="18" font.italic="true" color="black">
+ <states>
+ <State name="from" when="{!mouse.pressed}">
+ <SetProperty target="{text}" property="x" value="0"/>
+ </State>
+ <State name="to" when="{mouse.pressed}">
+ <SetProperty target="{text}" property="x" value="{item.width-100}"/>
+ </State>
+ </states>
+ <transitions>
+ <Transition fromState="*" toState="to" reversible="true">
+ <NumericAnimation properties="x" easing="{type}" />
+ </Transition>
+ </transitions>
+ </Text>
+ </Component>
+ </Repeater>
+ </VerticalLayout>
+ <MouseRegion id="mouse" anchors.fill="{layout}"/>
+</Rect>
diff --git a/tests/auto/declarative/visual/easing/image0.png b/tests/auto/declarative/visual/easing/image0.png
new file mode 100644
index 0000000..dbe03aa
--- /dev/null
+++ b/tests/auto/declarative/visual/easing/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/easing/manifest-play.xml b/tests/auto/declarative/visual/easing/manifest-play.xml
new file mode 100644
index 0000000..3c84452
--- /dev/null
+++ b/tests/auto/declarative/visual/easing/manifest-play.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+ <TestMouse time="480" type="2" button="1" buttons="1" globalPos="487,444" pos="483,417"/>
+ <TestFrame time="510" hash="83FB660D6CABAAFCB27C6EC001B14110"/>
+ <TestFrame time="540" hash="27FCD68F610024000CA6D3A8D9F0CF09"/>
+ <TestFrame time="570" hash="14728A6160AF51FCA8562D6A020BBA79"/>
+ <TestFrame time="600" hash="BDDB81682B30A6918927ACB59608D14E"/>
+ <TestFrame time="630" hash="03F16A41DCD31E41935E54763757C6D5"/>
+ <TestFrame time="660" hash="2D04EA1EBEDC77CF5D42A1B491A57EA6"/>
+ <TestFrame time="690" hash="762C36B33B75F24427CA45F4AD06B64E"/>
+ <TestFrame time="720" hash="AA02624CC889C95A99BBE58365F4FAAD"/>
+ <TestFrame time="750" hash="0529200188188708A18CE0F931780DBD"/>
+ <TestFrame time="780" hash="56036B63822AF34F26B149069CD189C6"/>
+ <TestFrame time="810" hash="CFFC6583E2BA1E47E1439BED6FE69665"/>
+ <TestFrame time="840" hash="25A1AFDC945D5264FF0337A421143A3C"/>
+ <TestFrame time="870" hash="601FA34B5E15E7B87E6490580C2E1858"/>
+ <TestFrame time="900" hash="1CA085F6CB8509957A51F6182F7F5443"/>
+ <TestFrame time="930" hash="09B5849DF18F6817F7450230DFEC0E95"/>
+ <TestFrame time="960" hash="15D212C1291DF97E3DEA5AA8793AD5CB"/>
+ <TestFrame time="990" hash="D6E42E8F4D06BDDBAE998079AC2C79AD"/>
+ <TestFrame time="1020" hash="7016B5C435006D859AB087A73299B6D5"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/easing/manifest.xml b/tests/auto/declarative/visual/easing/manifest.xml
new file mode 100644
index 0000000..3c84452
--- /dev/null
+++ b/tests/auto/declarative/visual/easing/manifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+ <TestMouse time="480" type="2" button="1" buttons="1" globalPos="487,444" pos="483,417"/>
+ <TestFrame time="510" hash="83FB660D6CABAAFCB27C6EC001B14110"/>
+ <TestFrame time="540" hash="27FCD68F610024000CA6D3A8D9F0CF09"/>
+ <TestFrame time="570" hash="14728A6160AF51FCA8562D6A020BBA79"/>
+ <TestFrame time="600" hash="BDDB81682B30A6918927ACB59608D14E"/>
+ <TestFrame time="630" hash="03F16A41DCD31E41935E54763757C6D5"/>
+ <TestFrame time="660" hash="2D04EA1EBEDC77CF5D42A1B491A57EA6"/>
+ <TestFrame time="690" hash="762C36B33B75F24427CA45F4AD06B64E"/>
+ <TestFrame time="720" hash="AA02624CC889C95A99BBE58365F4FAAD"/>
+ <TestFrame time="750" hash="0529200188188708A18CE0F931780DBD"/>
+ <TestFrame time="780" hash="56036B63822AF34F26B149069CD189C6"/>
+ <TestFrame time="810" hash="CFFC6583E2BA1E47E1439BED6FE69665"/>
+ <TestFrame time="840" hash="25A1AFDC945D5264FF0337A421143A3C"/>
+ <TestFrame time="870" hash="601FA34B5E15E7B87E6490580C2E1858"/>
+ <TestFrame time="900" hash="1CA085F6CB8509957A51F6182F7F5443"/>
+ <TestFrame time="930" hash="09B5849DF18F6817F7450230DFEC0E95"/>
+ <TestFrame time="960" hash="15D212C1291DF97E3DEA5AA8793AD5CB"/>
+ <TestFrame time="990" hash="D6E42E8F4D06BDDBAE998079AC2C79AD"/>
+ <TestFrame time="1020" hash="7016B5C435006D859AB087A73299B6D5"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/easing/pics/qtlogo.png b/tests/auto/declarative/visual/easing/pics/qtlogo.png
new file mode 100644
index 0000000..399bd0b
--- /dev/null
+++ b/tests/auto/declarative/visual/easing/pics/qtlogo.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flickable/Day.qml b/tests/auto/declarative/visual/flickable/Day.qml
new file mode 100644
index 0000000..0765e2f
--- /dev/null
+++ b/tests/auto/declarative/visual/flickable/Day.qml
@@ -0,0 +1,8 @@
+<Rect width="400" height="500" radius="7" pen.color="black" id="Page">
+ <properties>
+ <Property name="day" type="string" />
+ </properties>
+
+ <Image x="10" y="10" file="cork.jpg" opaque="true"/>
+ <Text x="20" y="20" height="40" font.size="14" font.bold="true" width="370" text="{day}" style="Outline" styleColor="#dedede"/>
+</Rect>
diff --git a/tests/auto/declarative/visual/flickable/cork.jpg b/tests/auto/declarative/visual/flickable/cork.jpg
new file mode 100644
index 0000000..d4d706c
--- /dev/null
+++ b/tests/auto/declarative/visual/flickable/cork.jpg
Binary files differ
diff --git a/tests/auto/declarative/visual/flickable/flickable.xml b/tests/auto/declarative/visual/flickable/flickable.xml
new file mode 100644
index 0000000..78bf42f
--- /dev/null
+++ b/tests/auto/declarative/visual/flickable/flickable.xml
@@ -0,0 +1,43 @@
+<Rect color="lightSteelBlue" width="800" height="500">
+ <ListModel id="List">
+ <Day>
+ <name>Sunday</name>
+ <dayColor>#808080</dayColor>
+ </Day>
+ <Day>
+ <name>Monday</name>
+ <dayColor>blue</dayColor>
+ </Day>
+ <Day>
+ <name>Tuesday</name>
+ <dayColor>yellow</dayColor>
+ </Day>
+ <Day>
+ <name>Wednesday</name>
+ <dayColor>purple</dayColor>
+ </Day>
+ <Day>
+ <name>Thursday</name>
+ <dayColor>blue</dayColor>
+ </Day>
+ <Day>
+ <name>Friday</name>
+ <dayColor>green</dayColor>
+ </Day>
+ <Day>
+ <name>Saturday</name>
+ <dayColor>orange</dayColor>
+ </Day>
+ </ListModel>
+
+ <Flickable id="Flick" anchors.fill="{parent}" viewportWidth="{Lay.width}">
+ <HorizontalLayout id="Lay">
+ <Repeater dataSource="{List}">
+ <Component>
+ <Day day="{name}" color="{dayColor}" />
+ </Component>
+ </Repeater>
+ </HorizontalLayout>
+ </Flickable>
+
+</Rect>
diff --git a/tests/auto/declarative/visual/flickable/image0.png b/tests/auto/declarative/visual/flickable/image0.png
new file mode 100644
index 0000000..a70ec71
--- /dev/null
+++ b/tests/auto/declarative/visual/flickable/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flickable/manifest-fail.xml b/tests/auto/declarative/visual/flickable/manifest-fail.xml
new file mode 100644
index 0000000..0701fa1
--- /dev/null
+++ b/tests/auto/declarative/visual/flickable/manifest-fail.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+ <TestMouse time="930" type="2" button="1" buttons="1" globalPos="1459,490" pos="712,463"/>
+ <TestMouse time="1020" type="5" button="0" buttons="1" globalPos="1457,490" pos="710,463"/>
+ <TestMouse time="1020" type="5" button="0" buttons="1" globalPos="1454,490" pos="707,463"/>
+ <TestMouse time="1020" type="5" button="0" buttons="1" globalPos="1446,488" pos="699,461"/>
+ <TestMouse time="1020" type="5" button="0" buttons="1" globalPos="1438,488" pos="691,461"/>
+ <TestFrame time="1020" hash="3A44CE7B924456B70E9ACAA4D6211036"/>
+ <TestMouse time="1050" type="5" button="0" buttons="1" globalPos="1402,484" pos="655,457"/>
+ <TestMouse time="1050" type="5" button="0" buttons="1" globalPos="1386,484" pos="639,457"/>
+ <TestFrame time="1050" hash="CC4B8F76C3758329C4792CC2499588B9"/>
+ <TestMouse time="1080" type="5" button="0" buttons="1" globalPos="1328,478" pos="581,451"/>
+ <TestFrame time="1080" hash="A314FC89F9915A0F62E77C649052F30B"/>
+ <TestMouse time="1110" type="5" button="0" buttons="1" globalPos="1306,476" pos="559,449"/>
+ <TestMouse time="1110" type="5" button="0" buttons="1" globalPos="1258,472" pos="511,445"/>
+ <TestMouse time="1110" type="5" button="0" buttons="1" globalPos="1234,468" pos="487,441"/>
+ <TestFrame time="1110" hash="496BEE45FD87ACA4335EB656DAB38E7C"/>
+ <TestMouse time="1140" type="5" button="0" buttons="1" globalPos="1206,466" pos="459,439"/>
+ <TestMouse time="1140" type="5" button="0" buttons="1" globalPos="1140,460" pos="393,433"/>
+ <TestMouse time="1140" type="5" button="0" buttons="1" globalPos="1106,454" pos="359,427"/>
+ <TestFrame time="1140" hash="9052B7F038D1BE19B5C603F2B376D95C"/>
+ <TestMouse time="1170" type="5" button="0" buttons="1" globalPos="980,438" pos="233,411"/>
+ <TestFrame time="1170" hash="75EBD16D2210983178EC267DD5C7E3DC"/>
+ <TestMouse time="1200" type="5" button="0" buttons="1" globalPos="930,432" pos="183,405"/>
+ <TestMouse time="1200" type="3" button="1" buttons="0" globalPos="930,432" pos="183,405"/>
+ <TestFrame time="1200" hash="A016C7981ACC7C26D0CDE0CF7D71E929"/>
+ <TestFrame time="1260" hash="A2EA153F54B2D98DEC895FC72D3279F0"/>
+ <TestFrame time="1290" hash="2702B6D7429FC955B2061C368910309F"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/flickable/manifest.xml b/tests/auto/declarative/visual/flickable/manifest.xml
new file mode 100644
index 0000000..84d6890
--- /dev/null
+++ b/tests/auto/declarative/visual/flickable/manifest.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+ <TestMouse time="930" type="2" button="1" buttons="1" globalPos="1459,490" pos="712,463"/>
+ <TestMouse time="1020" type="5" button="0" buttons="1" globalPos="1457,490" pos="710,463"/>
+ <TestMouse time="1020" type="5" button="0" buttons="1" globalPos="1454,490" pos="707,463"/>
+ <TestMouse time="1020" type="5" button="0" buttons="1" globalPos="1446,488" pos="699,461"/>
+ <TestMouse time="1020" type="5" button="0" buttons="1" globalPos="1438,488" pos="691,461"/>
+ <TestFrame time="1020" hash="3A44CE7B924456B70E9ACAA4D6211036"/>
+ <TestMouse time="1050" type="5" button="0" buttons="1" globalPos="1402,484" pos="655,457"/>
+ <TestMouse time="1050" type="5" button="0" buttons="1" globalPos="1386,484" pos="639,457"/>
+ <TestFrame time="1050" hash="CC4B8F76C3758329C4792CC2499588B9"/>
+ <TestMouse time="1080" type="5" button="0" buttons="1" globalPos="1328,478" pos="581,451"/>
+ <TestFrame time="1080" hash="A314FC89F9915A0F62E77C649052F30B"/>
+ <TestMouse time="1110" type="5" button="0" buttons="1" globalPos="1306,476" pos="559,449"/>
+ <TestMouse time="1110" type="5" button="0" buttons="1" globalPos="1258,472" pos="511,445"/>
+ <TestMouse time="1110" type="5" button="0" buttons="1" globalPos="1234,468" pos="487,441"/>
+ <TestFrame time="1110" hash="496BEE45FD87ACA4335EB656DAB38E7C"/>
+ <TestMouse time="1140" type="5" button="0" buttons="1" globalPos="1206,466" pos="459,439"/>
+ <TestMouse time="1140" type="5" button="0" buttons="1" globalPos="1140,460" pos="393,433"/>
+ <TestMouse time="1140" type="5" button="0" buttons="1" globalPos="1106,454" pos="359,427"/>
+ <TestFrame time="1140" hash="9052B7F038D1BE19B5C603F2B376D95C"/>
+ <TestMouse time="1170" type="5" button="0" buttons="1" globalPos="980,438" pos="233,411"/>
+ <TestFrame time="1170" hash="75EBD16D2210983178EC267DD5C7E3DC"/>
+ <TestMouse time="1200" type="5" button="0" buttons="1" globalPos="930,432" pos="183,405"/>
+ <TestMouse time="1200" type="3" button="1" buttons="0" globalPos="930,432" pos="183,405"/>
+ <TestFrame time="1200" hash="A016C7981ACC7C26D0CDE0CF7D71E929"/>
+ <TestFrame time="1260" hash="203B3D2224AA0B9CB9DB64C837402047"/>
+ <TestFrame time="1290" hash="E9974E5662F22716C9BC2CF8D1FF12FE"/>
+ <TestFrame time="1320" hash="1218CCCC399AE53D5D99D3E7AFD73A16"/>
+ <TestFrame time="1350" hash="FA5D19578629F56972955E9FE530BE59"/>
+ <TestFrame time="1380" hash="B5B23BBDF1FEB6E6B55AE3909F607D96"/>
+ <TestFrame time="1410" hash="17EDC257AF24F178455CDEE7B9D73A9F"/>
+ <TestFrame time="1440" hash="F62E75656DC8AEF20426535DC25FC9F7"/>
+ <TestFrame time="1470" hash="973D39071B13FBBC700964CA1E4995DA"/>
+ <TestFrame time="1500" hash="391C67A59AC71B498381FC4D3DA1E8BB"/>
+ <TestFrame time="1530" hash="C1D86256E4BE487CB61AB1CC8D277FF2"/>
+ <TestFrame time="1560" hash="D5324FF0B16AA4B532007236222FEEAA"/>
+ <TestFrame time="1590" hash="4B14446DE1B9DE22D3DFF86A7CC46A05"/>
+ <TestFrame time="1620" hash="49E6FF8DEB537ECE9BDF56135FCB8BE3"/>
+ <TestFrame time="1650" hash="25D8D454CD32513F2E711D1B09DF87AF"/>
+ <TestFrame time="1680" hash="AB511F44DD761AC1070733CB81731451"/>
+ <TestFrame time="1710" hash="3441D361DB85B2522C8CCB8C21D95E70"/>
+ <TestFrame time="1740" hash="DB333DF49E6DB519F1F5436F6EEEF18E"/>
+ <TestFrame time="1770" hash="97044C41A8C27B534707352334CB100E"/>
+ <TestFrame time="1800" hash="C9EE4321669BB45A574D2CD3448553FE"/>
+ <TestFrame time="1830" hash="6E1067FB547479F8AC0214B1DE4F1ABD"/>
+ <TestFrame time="1860" hash="9AC3067759043EF1C8138C6E3D3B26D1"/>
+ <TestFrame time="1890" hash="F90BB455E7D0266C631BFD6657AC673F"/>
+ <TestFrame time="1920" hash="064CA0BCE5BCE1E5409F7E95F501843A"/>
+ <TestFrame time="1950" hash="AC5489FE171E537E5AF6EC9F8B5241DA"/>
+ <TestFrame time="1980" hash="BBF5D953DCF7FF64D99BF10E244FACE0"/>
+ <TestFrame time="2010" hash="309FC8E37A3EC93C41BC5E2F8F2962DB"/>
+ <TestFrame time="2040" hash="192B13ADD78B36E54E3D39E998641F82"/>
+ <TestFrame time="2070" hash="10F9D012CD1ECD9C8A872AA28191599E"/>
+ <TestFrame time="2100" hash="E3C9CE476A02915B7EEAA5D16747BD74"/>
+ <TestFrame time="2130" hash="24AD4F88A8BE8E4059517DA5AB9EC3F9"/>
+ <TestFrame time="2160" hash="74CE8AFFE7BAC8380E9EE27E482107E8"/>
+ <TestFrame time="2190" hash="C3377013131C3D1EEFFAEC37C0359E7B"/>
+ <TestFrame time="2220" hash="1850C61F261E6E148E12C9D9508411E4"/>
+ <TestFrame time="2250" hash="30EEAD3AC4C869FEB9A2E2F18BB5F335"/>
+ <TestFrame time="2280" hash="EB0F744274AF8FF27CAFC73053B63C87"/>
+ <TestFrame time="2310" hash="ADF16B9E820CF7F77E17E2383E0BF345"/>
+ <TestFrame time="2340" hash="8623C727CB6605607679B7C973E5CE61"/>
+ <TestFrame time="2370" hash="DE795BC19AD3B24FF091D6EB500C0C9A"/>
+ <TestFrame time="2400" hash="E85F53F766BE13A62272442916217181"/>
+ <TestFrame time="2430" hash="B5B05BF6D74AC22BC0DC5ECF8AFFD571"/>
+ <TestFrame time="2460" hash="C9DB0041AEA560EA3569FA6A37A8E226"/>
+ <TestFrame time="2490" hash="96B6E45404C4CB7C65A7113294679C96"/>
+ <TestFrame time="2520" hash="780599814A9AEEB63B6604F8627966FC"/>
+ <TestFrame time="2550" hash="40D7E36CD63DC9B6F5E0340F8E61DE4F"/>
+ <TestFrame time="2580" hash="127E4A92CC2AF9B6C7B5686ECED260E3"/>
+ <TestFrame time="2610" hash="10FEB4963AAD931587BAC2101367CB92"/>
+ <TestFrame time="2640" hash="2926893CD68516281E47EAD04720E4DB"/>
+ <TestFrame time="2670" hash="23F790EF701E37C3959465BF5298C9C2"/>
+ <TestFrame time="2700" hash="461224D0A6662450BA361FAF90CA3087"/>
+ <TestFrame time="2730" hash="3779C1CC5CD18633C70CE5614C2FCA33"/>
+ <TestFrame time="2760" hash="D93F3000F95110464793C9BAEF58D694"/>
+ <TestFrame time="2790" hash="0BFCCED8AE73FBCAC251442F002D603C"/>
+ <TestFrame time="2820" hash="AC1D13A5508255DCA994CC4685FB0AE3"/>
+ <TestFrame time="2850" hash="A6709853B44AB203FC8806D3F4159639"/>
+ <TestFrame time="2880" hash="171589A0F67D72F1685836F5EFF2DD10"/>
+ <TestFrame time="2910" hash="D4984C2B663CFA0CDE95F9AD5BC9937B"/>
+ <TestFrame time="2940" hash="1BB6D261C9E800004B180FB8EC0B45AD"/>
+ <TestFrame time="2970" hash="46CD4E37C989FACF2B7CD71A16DB495A"/>
+ <TestFrame time="3000" hash="8ED436FF855C96A8CEB795AE175A7C54"/>
+ <TestFrame time="3030" hash="8ED436FF855C96A8CEB795AE175A7C54"/>
+ <TestFrame time="3060" hash="138D8CC351C847F266C63F323BABD7FE"/>
+ <TestFrame time="3090" hash="8D90560CCF5EEB1475F3AA46295E4DD0"/>
+ <TestFrame time="3120" hash="DD893A953B945365B0F9287A79826A6D"/>
+ <TestFrame time="3150" hash="386A768FD485BB66C9DC1465399B58C8"/>
+ <TestFrame time="3180" hash="21340437F1A05C216005157A8E8A9EEF"/>
+ <TestFrame time="3210" hash="6E2DA9DA5964F59715B08FD59D8BC3EF"/>
+ <TestFrame time="3240" hash="DC7108F44E225D70349889D9E3F62E74"/>
+ <TestMouse time="4110" type="2" button="1" buttons="1" globalPos="853,492" pos="106,465"/>
+ <TestMouse time="4170" type="5" button="0" buttons="1" globalPos="854,493" pos="107,466"/>
+ <TestMouse time="4170" type="5" button="0" buttons="1" globalPos="855,493" pos="108,466"/>
+ <TestMouse time="4170" type="5" button="0" buttons="1" globalPos="856,494" pos="109,467"/>
+ <TestMouse time="4170" type="5" button="0" buttons="1" globalPos="857,494" pos="110,467"/>
+ <TestMouse time="4200" type="5" button="0" buttons="1" globalPos="859,494" pos="112,467"/>
+ <TestMouse time="4200" type="5" button="0" buttons="1" globalPos="860,495" pos="113,468"/>
+ <TestMouse time="4200" type="5" button="0" buttons="1" globalPos="862,495" pos="115,468"/>
+ <TestFrame time="4200" hash="3946A595E81E4388AFDDDB2539B21BF3"/>
+ <TestMouse time="4230" type="5" button="0" buttons="1" globalPos="864,495" pos="117,468"/>
+ <TestMouse time="4230" type="5" button="0" buttons="1" globalPos="869,495" pos="122,468"/>
+ <TestMouse time="4230" type="5" button="0" buttons="1" globalPos="872,495" pos="125,468"/>
+ <TestFrame time="4230" hash="D9F7C86886CC5309846694F5DA98A123"/>
+ <TestMouse time="4260" type="5" button="0" buttons="1" globalPos="875,495" pos="128,468"/>
+ <TestMouse time="4260" type="5" button="0" buttons="1" globalPos="892,497" pos="145,470"/>
+ <TestFrame time="4260" hash="0B923428F4EAF40CB032FE8880B10943"/>
+ <TestMouse time="4290" type="5" button="0" buttons="1" globalPos="911,499" pos="164,472"/>
+ <TestMouse time="4290" type="5" button="0" buttons="1" globalPos="919,499" pos="172,472"/>
+ <TestFrame time="4290" hash="F1FCED7910188DBEDC62E289EC98D14A"/>
+ <TestMouse time="4320" type="5" button="0" buttons="1" globalPos="938,499" pos="191,472"/>
+ <TestFrame time="4320" hash="71A01976611816A5D42BBB6BC6DE5336"/>
+ <TestMouse time="4350" type="5" button="0" buttons="1" globalPos="957,501" pos="210,474"/>
+ <TestMouse time="4350" type="5" button="0" buttons="1" globalPos="960,501" pos="213,474"/>
+ <TestFrame time="4350" hash="204D5511DFAA28AF3E499FD5E503592A"/>
+ <TestMouse time="4380" type="5" button="0" buttons="1" globalPos="968,501" pos="221,474"/>
+ <TestMouse time="4380" type="5" button="0" buttons="1" globalPos="986,503" pos="239,476"/>
+ <TestMouse time="4380" type="5" button="0" buttons="1" globalPos="989,503" pos="242,476"/>
+ <TestFrame time="4380" hash="E7F2934FB80FD155AAE4E558B1D31AF9"/>
+ <TestMouse time="4410" type="5" button="0" buttons="1" globalPos="1015,501" pos="268,474"/>
+ <TestMouse time="4410" type="5" button="0" buttons="1" globalPos="1025,499" pos="278,472"/>
+ <TestFrame time="4410" hash="DE795BC19AD3B24FF091D6EB500C0C9A"/>
+ <TestMouse time="4440" type="5" button="0" buttons="1" globalPos="1065,497" pos="318,470"/>
+ <TestFrame time="4440" hash="3A2D5734CCC3E5690EF24D412B5ADE32"/>
+ <TestMouse time="4470" type="5" button="0" buttons="1" globalPos="1083,495" pos="336,468"/>
+ <TestMouse time="4470" type="5" button="0" buttons="1" globalPos="1135,493" pos="388,466"/>
+ <TestMouse time="4470" type="5" button="0" buttons="1" globalPos="1171,489" pos="424,462"/>
+ <TestFrame time="4470" hash="A5F66816E008610C1DA44270F837C9DF"/>
+ <TestMouse time="4500" type="5" button="0" buttons="1" globalPos="1215,489" pos="468,462"/>
+ <TestMouse time="4500" type="5" button="0" buttons="1" globalPos="1319,483" pos="572,456"/>
+ <TestMouse time="4500" type="5" button="0" buttons="1" globalPos="1379,479" pos="632,452"/>
+ <TestFrame time="4500" hash="6AE11928E7948AD5F9CE5EE07B5E7390"/>
+ <TestMouse time="4530" type="5" button="0" buttons="1" globalPos="1441,475" pos="694,448"/>
+ <TestMouse time="4530" type="3" button="1" buttons="0" globalPos="1441,475" pos="694,448"/>
+ <TestFrame time="4530" hash="47B438BC833CFF7984D3E158B54F0EA5"/>
+ <TestFrame time="4590" hash="DA134DD6826A87BC08F3BE59F3D2866D"/>
+ <TestFrame time="4620" hash="D1E87BD1C6264CE83979D34500EEB85B"/>
+ <TestFrame time="4650" hash="37C13A368649152DD1D43BDD17BEEE97"/>
+ <TestFrame time="4680" hash="C461AE2C388F4B06E958C12B543E53C0"/>
+ <TestFrame time="4710" hash="6070DD498E15C27243F09FD8CF8C0D2F"/>
+ <TestFrame time="4740" hash="FB74E95CF41BDA785991BA01369E9320"/>
+ <TestFrame time="4770" hash="F52AE455BBA3BAD36ABB4DB2480549D6"/>
+ <TestFrame time="4800" hash="9BC4E043F6595493ED32BBAAB949CC15"/>
+ <TestFrame time="4830" hash="4C87F70F6A46B2066021A68435BB285D"/>
+ <TestFrame time="4860" hash="282A523039F702F22C5D7F2B00BCA1F4"/>
+ <TestFrame time="4890" hash="D1623E75F20C00F6F357346F57E5C343"/>
+ <TestFrame time="4920" hash="F96CC72E3671C64D87719E5DF8303FA9"/>
+ <TestFrame time="4950" hash="44D4E09F9AB5C20E7A7F1AEF920B3599"/>
+ <TestFrame time="4980" hash="BBAD1BD87E29C1F0834B16DA9C1317A4"/>
+ <TestFrame time="5010" hash="66DF69AD2EA4823E59F6FC296910822F"/>
+ <TestFrame time="5040" hash="A0DCE22CFADFE091C5474C231EAD191E"/>
+ <TestFrame time="5070" hash="AE67DD3CD8B77D001288558E3C67E675"/>
+ <TestFrame time="5100" hash="B028CC11B70C5288436E49DD439F9F46"/>
+ <TestFrame time="5130" hash="2FBEFA9C751317D668A1074E8BCB8B10"/>
+ <TestFrame time="5160" hash="2DB3A59F7CB89B89CD45B86008CC0541"/>
+ <TestFrame time="5190" hash="AFE0FD3CB16F9DDD3E8DAD46656BE099"/>
+ <TestFrame time="5220" hash="90C04F980A0C008D4B919D9A4B663762"/>
+ <TestFrame time="5250" hash="215CB75F6359548B7A4A408E83049A25"/>
+ <TestFrame time="5280" hash="8EC68EA3F6B54415EC9B860B0207351E"/>
+ <TestFrame time="5310" hash="8FC14C2EB103B4FDC5B17E6E0F2386D1"/>
+ <TestFrame time="5340" hash="938DA507656430E1758CB8B5E9D874B1"/>
+ <TestFrame time="5370" hash="30A3166F0169715DA9FECD48DA257625"/>
+ <TestFrame time="5400" hash="0C24CD68AFE9C24380178417FE835494"/>
+ <TestFrame time="5430" hash="C8A18880023CB12BA98EBDFF65875874"/>
+ <TestFrame time="5460" hash="FE3BCA8DC715A19161FCD48C728366A0"/>
+ <TestFrame time="5490" hash="4771F9D8AA2A177A190879EB543FA138"/>
+ <TestFrame time="5520" hash="971D611BC939AB20B998D659DF2235FE"/>
+ <TestFrame time="5550" hash="7AF899892AE28C61B71A5682F9540DB5"/>
+ <TestFrame time="5580" hash="CCF349DCA802D5D68B6C9CB368104EF8"/>
+ <TestFrame time="5610" hash="3DC13F8B693648ABBE8FD6935832BEC7"/>
+ <TestFrame time="5640" hash="ED2AD5E716D69FD1A87133209695E911"/>
+ <TestFrame time="5670" hash="037B45A66950DF70D8BD7BC0E000ECC7"/>
+ <TestFrame time="5700" hash="43B59CF46A829CAFF7D9C0A6D1175581"/>
+ <TestFrame time="5730" hash="6FF016CE82BFD220418C0A9A644F2F81"/>
+ <TestFrame time="5760" hash="96D37AFF283210D59287526798E9376D"/>
+ <TestFrame time="5790" hash="7289570ABB671359AC2F2DF1898748CA"/>
+ <TestFrame time="5820" hash="2B3AF6424765512B8949BBB9BF6571DC"/>
+ <TestFrame time="5850" hash="23054E1F931342B8A6C5F6D30A9FF158"/>
+ <TestFrame time="5880" hash="E3D6EBB07FC90AD2483E95C09CB9E074"/>
+ <TestFrame time="5910" hash="08EE4C4D9F161AB4118EAD4F4AA8D5B3"/>
+ <TestFrame time="5940" hash="96D37AFF283210D59287526798E9376D"/>
+ <TestFrame time="5970" hash="40FB8747AACD078576573CF346E2C418"/>
+ <TestFrame time="6000" hash="4095D9B46D265D28C88DE0D0E02AC840"/>
+ <TestFrame time="6030" hash="E370C2A5451DC73AE4F742D52E3DAD4D"/>
+ <TestFrame time="6060" hash="AC4DC18BEFE0895C1ADF8EE2E3094A09"/>
+ <TestFrame time="6090" hash="AC4DC18BEFE0895C1ADF8EE2E3094A09"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/flipable/flipable.xml b/tests/auto/declarative/visual/flipable/flipable.xml
new file mode 100644
index 0000000..d769e55
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/flipable.xml
@@ -0,0 +1,138 @@
+<Rect color="lightsteelblue" height="400" width="500">
+ <VisualModel id="MyVisualModel">
+ <model>
+ <ListModel id="ListModel">
+ <Person>
+ <name>Jessica</name>
+ <picture>face.png</picture>
+ </Person>
+ <Person>
+ <name>John</name>
+ <picture>photo0.png</picture>
+ </Person>
+ <Person>
+ <name>Susan</name>
+ <picture>photo10.png</picture>
+ </Person>
+ <Person>
+ <name>Samantha</name>
+ <picture>photo1.png</picture>
+ </Person>
+ <Person>
+ <name>Mark</name>
+ <picture>photo2.png</picture>
+ </Person>
+ <Person>
+ <name>Sarah</name>
+ <picture>photo3.png</picture>
+ </Person>
+ <Person>
+ <name>Pam</name>
+ <picture>photo4.png</picture>
+ </Person>
+ <Person>
+ <name>April</name>
+ <picture>photo5.png</picture>
+ </Person>
+ <Person>
+ <name>Tarryn</name>
+ <picture>photo6.png</picture>
+ </Person>
+ <Person>
+ <name>Geoff</name>
+ <picture>photo7.png</picture>
+ </Person>
+ <Person>
+ <name>Bill</name>
+ <picture>photo8.png</picture>
+ </Person>
+ <Person>
+ <name>Stuart</name>
+ <picture>photo9.png</picture>
+ </Person>
+ </ListModel>
+ </model>
+ <delegate>
+ <Package>
+ <Flipable id="MeRect" width="100" height="100">
+ <properties>
+ <Property name="r" type="Real" />
+ </properties>
+ <transform>
+ <Perspective angle="90" x="50" y="50" aspect="1" scale="256"/>
+ <Axis xStart="50" xEnd="50" yStart="0" yEnd="1" rotation="{MeRect.r}" />
+ </transform>
+
+ <front>
+ <Rect radius="5" color="red" width="100" height="100">
+ <Text text="{name}" />
+ </Rect>
+ </front>
+
+ <back>
+ <Rect radius="5" color="red" width="100" height="100">
+ <Image anchors.horizontalCenter="{parent.horizontalCenter}" anchors.verticalCenter="{parent.verticalCenter}" file="{picture}" />
+ </Rect>
+ </back>
+ </Flipable>
+
+ <Item Package.name="leftBox" id="LeftBox"
+ width="100" height="100">
+ <Rect opacity="0.1" width="80" height="80" radius="4"
+ color="grey" x="10" y="10">
+ <Text text="{name}" />
+ <MouseRegion anchors.fill="{parent}" onClick="if(MyItem.currentState=='left') MyItem.currentState='right'; else MyItem.currentState='left';" />
+ </Rect>
+ </Item>
+ <Item Package.name="rightBox" id="RightBox"
+ width="100" height="100">
+ <Rect opacity="0.1" width="80" height="80" radius="4"
+ color="grey" x="10" y="10">
+ <Text text="{name}" />
+ <MouseRegion anchors.fill="{parent}" onClick="if(MyItem.currentState=='left') MyItem.currentState='right'; else MyItem.currentState='left';" />
+ </Rect>
+ </Item>
+ <Item id="MyItem">
+ <states>
+ <State name="left">
+ <SetProperty target="{MeRect}" property="moveToParent" value="{LeftBox}" />
+ </State>
+ <State name="right">
+ <SetProperty target="{MeRect}" property="moveToParent" value="{RightBox}" />
+ <SetProperty target="{MeRect}" property="r" value="180" />
+ </State>
+ </states>
+ <transitions>
+ <Transition fromState="*" toState="*">
+ <NumericAnimation property="r" duration="500" />
+ <SerialAnimation>
+ <SetPropertyAction target="{MeRect}" property="moveToParent" value="{Bounce}" />
+ <ParallelAnimation>
+ <NumericAnimation target="{MeRect}" properties="x" to="0" duration="250" />
+ <NumericAnimation target="{MeRect}" properties="y" to="0" easing="easeInQuad" duration="250"/>
+ </ParallelAnimation>
+ <SetPropertyAction target="{MeRect}" property="moveToParent" />
+ <ParallelAnimation>
+ <NumericAnimation target="{MeRect}" properties="x" to="0" duration="250"/>
+ <NumericAnimation target="{MeRect}" properties="y" to="0" easing="easeOutQuad" duration="250"/>
+ </ParallelAnimation>
+ </SerialAnimation>
+ </Transition>
+ </transitions>
+ <currentState>left</currentState>
+ </Item>
+
+ </Package>
+ </delegate>
+ </VisualModel>
+
+ <Item width="800" height="400" clip="true">
+ <Item z="100" id="Bounce" x="200" y="300" />
+ <ListView id="MyListView" width="400" height="400" x="400"
+ model="{MyVisualModel.parts.rightBox}" />
+
+ <ListView id="MyListView2" width="400" height="400"
+ model="{MyVisualModel.parts.leftBox}" />
+ </Item>
+
+</Rect>
diff --git a/tests/auto/declarative/visual/flipable/image0.png b/tests/auto/declarative/visual/flipable/image0.png
new file mode 100644
index 0000000..affb8a5
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flipable/manifest-play.xml b/tests/auto/declarative/visual/flipable/manifest-play.xml
new file mode 100644
index 0000000..81c08e4
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/manifest-play.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+ <TestMouse time="2040" type="2" button="1" buttons="1" globalPos="812,72" pos="65,45"/>
+ <TestMouse time="2100" type="3" button="1" buttons="0" globalPos="812,72" pos="65,45"/>
+ <TestFrame time="2130" hash="210454ECF70EEA9CA43DD391BC23178B"/>
+ <TestFrame time="2160" hash="F6612DAD879208F4AF100337271C445C"/>
+ <TestFrame time="2190" hash="C77FC41100D0B066F8F0BF4ABCF2F0BF"/>
+ <TestFrame time="2220" hash="1AB3A42E6FC271E049E6071A88AB8EE4"/>
+ <TestFrame time="2250" hash="DB3D5BC6882699DCC0208E4F5294B609"/>
+ <TestFrame time="2280" hash="DC5A8B44283DA4A81D3994B873FC5695"/>
+ <TestFrame time="2310" hash="5149027ECF7813BA64D3AB8FFE0265F5"/>
+ <TestFrame time="2340" hash="B7E801DF476C012AC3E9E48A9D4AA321"/>
+ <TestFrame time="2370" hash="F31A647A6A3EC86D7F16EB3147E5FC29"/>
+ <TestFrame time="2400" hash="FBB068C39D5188A175075667B584F1BE"/>
+ <TestFrame time="2430" hash="EC487AB66384A4A3A718D03555EBFD41"/>
+ <TestFrame time="2460" hash="C7AD11EB051B11ACBA38027013215A05"/>
+ <TestFrame time="2490" hash="AA38FD8E97EC394488274127630E7946"/>
+ <TestFrame time="2520" hash="1CA2B617AC966B54FFA1A61914F68A9D"/>
+ <TestFrame time="2550" hash="1726C0BAA930CAF282154F14AC2FD120"/>
+ <TestFrame time="2580" hash="58F8196148C8B64191AF7B897A811CFB"/>
+ <TestFrame time="2610" hash="D56D3FA137AA63A0215611450B40F3E0"/>
+ <TestFrame time="2640" hash="5E1BCDF996B2903D1EAEAC65E17783C2"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/flipable/manifest.xml b/tests/auto/declarative/visual/flipable/manifest.xml
new file mode 100644
index 0000000..81c08e4
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/manifest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+ <TestMouse time="2040" type="2" button="1" buttons="1" globalPos="812,72" pos="65,45"/>
+ <TestMouse time="2100" type="3" button="1" buttons="0" globalPos="812,72" pos="65,45"/>
+ <TestFrame time="2130" hash="210454ECF70EEA9CA43DD391BC23178B"/>
+ <TestFrame time="2160" hash="F6612DAD879208F4AF100337271C445C"/>
+ <TestFrame time="2190" hash="C77FC41100D0B066F8F0BF4ABCF2F0BF"/>
+ <TestFrame time="2220" hash="1AB3A42E6FC271E049E6071A88AB8EE4"/>
+ <TestFrame time="2250" hash="DB3D5BC6882699DCC0208E4F5294B609"/>
+ <TestFrame time="2280" hash="DC5A8B44283DA4A81D3994B873FC5695"/>
+ <TestFrame time="2310" hash="5149027ECF7813BA64D3AB8FFE0265F5"/>
+ <TestFrame time="2340" hash="B7E801DF476C012AC3E9E48A9D4AA321"/>
+ <TestFrame time="2370" hash="F31A647A6A3EC86D7F16EB3147E5FC29"/>
+ <TestFrame time="2400" hash="FBB068C39D5188A175075667B584F1BE"/>
+ <TestFrame time="2430" hash="EC487AB66384A4A3A718D03555EBFD41"/>
+ <TestFrame time="2460" hash="C7AD11EB051B11ACBA38027013215A05"/>
+ <TestFrame time="2490" hash="AA38FD8E97EC394488274127630E7946"/>
+ <TestFrame time="2520" hash="1CA2B617AC966B54FFA1A61914F68A9D"/>
+ <TestFrame time="2550" hash="1726C0BAA930CAF282154F14AC2FD120"/>
+ <TestFrame time="2580" hash="58F8196148C8B64191AF7B897A811CFB"/>
+ <TestFrame time="2610" hash="D56D3FA137AA63A0215611450B40F3E0"/>
+ <TestFrame time="2640" hash="5E1BCDF996B2903D1EAEAC65E17783C2"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/flipable/pics/arrow.png b/tests/auto/declarative/visual/flipable/pics/arrow.png
new file mode 100644
index 0000000..997190d
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/pics/arrow.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flipable/pics/face.png b/tests/auto/declarative/visual/flipable/pics/face.png
new file mode 100644
index 0000000..e9529ac
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/pics/face.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flipable/pics/photo0.png b/tests/auto/declarative/visual/flipable/pics/photo0.png
new file mode 100644
index 0000000..26bbf5b
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/pics/photo0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flipable/pics/photo1.png b/tests/auto/declarative/visual/flipable/pics/photo1.png
new file mode 100644
index 0000000..2230f71
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/pics/photo1.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flipable/pics/photo10.png b/tests/auto/declarative/visual/flipable/pics/photo10.png
new file mode 100644
index 0000000..119f142
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/pics/photo10.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flipable/pics/photo2.png b/tests/auto/declarative/visual/flipable/pics/photo2.png
new file mode 100644
index 0000000..e3d58c1
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/pics/photo2.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flipable/pics/photo3.png b/tests/auto/declarative/visual/flipable/pics/photo3.png
new file mode 100644
index 0000000..4b58df4
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/pics/photo3.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flipable/pics/photo4.png b/tests/auto/declarative/visual/flipable/pics/photo4.png
new file mode 100644
index 0000000..4ed4bd2
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/pics/photo4.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flipable/pics/photo5.png b/tests/auto/declarative/visual/flipable/pics/photo5.png
new file mode 100644
index 0000000..eb26704
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/pics/photo5.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flipable/pics/photo6.png b/tests/auto/declarative/visual/flipable/pics/photo6.png
new file mode 100644
index 0000000..69875ce
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/pics/photo6.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flipable/pics/photo7.png b/tests/auto/declarative/visual/flipable/pics/photo7.png
new file mode 100644
index 0000000..0b117c9
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/pics/photo7.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flipable/pics/photo8.png b/tests/auto/declarative/visual/flipable/pics/photo8.png
new file mode 100644
index 0000000..b77b997
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/pics/photo8.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flipable/pics/photo9.png b/tests/auto/declarative/visual/flipable/pics/photo9.png
new file mode 100644
index 0000000..8a974d6
--- /dev/null
+++ b/tests/auto/declarative/visual/flipable/pics/photo9.png
Binary files differ
diff --git a/tests/auto/declarative/visual/pauseAnimation/image0.png b/tests/auto/declarative/visual/pauseAnimation/image0.png
new file mode 100644
index 0000000..80fd4d1
--- /dev/null
+++ b/tests/auto/declarative/visual/pauseAnimation/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/pauseAnimation/manifest-play.xml b/tests/auto/declarative/visual/pauseAnimation/manifest-play.xml
new file mode 100644
index 0000000..6b15341
--- /dev/null
+++ b/tests/auto/declarative/visual/pauseAnimation/manifest-play.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+ <TestFrame time="60" hash="0C20D12464ABBDC45041EA5D9F2719B1"/>
+ <TestFrame time="90" hash="6579681C59DD571DF0EE4429D74FB5C7"/>
+ <TestFrame time="120" hash="7DA50C2984E012F217DC44F79AD86D55"/>
+ <TestFrame time="150" hash="D5E2A4ABDCA59FA26FCE968AB11F0719"/>
+ <TestFrame time="180" hash="005ACBEF952A8EE536E6308A48223E65"/>
+ <TestFrame time="210" hash="C4F844EE71F23635BB3EC7375F6A134F"/>
+ <TestFrame time="240" hash="D9604BE23A91327E6AB454609A9D4A13"/>
+ <TestFrame time="270" hash="DA60100DC55023C3BAB367D97C8F6A85"/>
+ <TestFrame time="300" hash="79EC710576427DF73DD03F39FBA6E2EB"/>
+ <TestFrame time="330" hash="FFD39C1122FE2F7877EF30591B539B40"/>
+ <TestFrame time="360" hash="C1A7B7D6D64AC5584C073C2881290696"/>
+ <TestFrame time="390" hash="29ECE1BCA4D21FB5862091317D430A13"/>
+ <TestFrame time="420" hash="C1A7B7D6D64AC5584C073C2881290696"/>
+ <TestFrame time="450" hash="4AC43A03CC6F2020AB5F894D704092AC"/>
+ <TestFrame time="480" hash="6CC9DE62A0C8FA5E42EAC1B01E99AC32"/>
+ <TestFrame time="510" hash="D754D35D0793F9F7D4F6249A874E4C45"/>
+ <TestFrame time="540" hash="B2C778A5EFF5F01EDC54F03D8B4DE8C7"/>
+ <TestFrame time="570" hash="A4D9DFDBF32C0AD31794B04A2E23A0DB"/>
+ <TestFrame time="600" hash="5025EB75C88F0760F637E0342B7F88A2"/>
+ <TestFrame time="630" hash="F4732FF2DF93FE67CB850DEC34184924"/>
+ <TestFrame time="660" hash="97566CE9558D13EA0780BCE233097B27"/>
+ <TestFrame time="690" hash="2AD64CB01C9D50E0118D5ECE0A644DF2"/>
+ <TestFrame time="720" hash="721D7061811B5439C2E8E395917494BC"/>
+ <TestFrame time="750" hash="CE57E27AF329EBA4FAC3AB891F0407CE"/>
+ <TestFrame time="780" hash="41BA853C3403F68A23E708DF82E21C53"/>
+ <TestFrame time="810" hash="336D31586171F22D541B989D24B95CBB"/>
+ <TestFrame time="840" hash="6D63FB5C8A80F0280E88B2CDF8641BB9"/>
+ <TestFrame time="870" hash="EF8941674CB61F54853DC33652BB854E"/>
+ <TestFrame time="900" hash="0C20D12464ABBDC45041EA5D9F2719B1"/>
+ <TestFrame time="930" hash="53AE93140252373EAA4D9DA73756BD8E"/>
+ <TestFrame time="960" hash="AF3120FE262D2489C0ED33FBBEE1549F"/>
+ <TestFrame time="990" hash="A88A8129259F86DF5A73ADDC3649AD37"/>
+ <TestFrame time="1020" hash="3DB5E30EF19EA693C21CCF72892C4390"/>
+ <TestFrame time="1050" hash="E553F365912586C6408C8C53B1B7D118"/>
+ <TestFrame time="1080" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="1110" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="1140" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="1170" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="1200" hash="E553F365912586C6408C8C53B1B7D118"/>
+ <TestFrame time="1230" hash="3DB5E30EF19EA693C21CCF72892C4390"/>
+ <TestFrame time="1260" hash="A8B624EBFC9AB713D1CE55F318A6E90D"/>
+ <TestFrame time="1290" hash="AF3120FE262D2489C0ED33FBBEE1549F"/>
+ <TestFrame time="1320" hash="53AE93140252373EAA4D9DA73756BD8E"/>
+ <TestFrame time="1350" hash="BC426FB7C31751665B0D3F16E2CB0173"/>
+ <TestFrame time="1380" hash="DD60CBAFF6F34027474E92315DBC0EBC"/>
+ <TestFrame time="1410" hash="F0D8132489C2F2EF760E905B3C093726"/>
+ <TestFrame time="1440" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="1470" hash="DCF2867C127E041970047EC8F3EDC04F"/>
+ <TestFrame time="1500" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="1530" hash="41BA853C3403F68A23E708DF82E21C53"/>
+ <TestFrame time="1560" hash="CE57E27AF329EBA4FAC3AB891F0407CE"/>
+ <TestFrame time="1590" hash="A725B59B4947357546BBFC7DF3D830AF"/>
+ <TestFrame time="1620" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="1650" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="1680" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="1710" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="1740" hash="A725B59B4947357546BBFC7DF3D830AF"/>
+ <TestFrame time="1770" hash="CE57E27AF329EBA4FAC3AB891F0407CE"/>
+ <TestFrame time="1800" hash="41BA853C3403F68A23E708DF82E21C53"/>
+ <TestFrame time="1830" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="1860" hash="A350B70C5238A340E85FD4A3EC0390A3"/>
+ <TestFrame time="1890" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="1920" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="1950" hash="DCF2867C127E041970047EC8F3EDC04F"/>
+ <TestFrame time="1980" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="2010" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="2040" hash="A350B70C5238A340E85FD4A3EC0390A3"/>
+ <TestFrame time="3060" hash="0C20D12464ABBDC45041EA5D9F2719B1"/>
+ <TestFrame time="3090" hash="6579681C59DD571DF0EE4429D74FB5C7"/>
+ <TestFrame time="3120" hash="7DA50C2984E012F217DC44F79AD86D55"/>
+ <TestFrame time="3150" hash="D5E2A4ABDCA59FA26FCE968AB11F0719"/>
+ <TestFrame time="3180" hash="005ACBEF952A8EE536E6308A48223E65"/>
+ <TestFrame time="3210" hash="C4F844EE71F23635BB3EC7375F6A134F"/>
+ <TestFrame time="3240" hash="D9604BE23A91327E6AB454609A9D4A13"/>
+ <TestFrame time="3270" hash="DA60100DC55023C3BAB367D97C8F6A85"/>
+ <TestFrame time="3300" hash="79EC710576427DF73DD03F39FBA6E2EB"/>
+ <TestFrame time="3330" hash="FFD39C1122FE2F7877EF30591B539B40"/>
+ <TestFrame time="3360" hash="C1A7B7D6D64AC5584C073C2881290696"/>
+ <TestFrame time="3390" hash="29ECE1BCA4D21FB5862091317D430A13"/>
+ <TestFrame time="3420" hash="C1A7B7D6D64AC5584C073C2881290696"/>
+ <TestFrame time="3450" hash="4AC43A03CC6F2020AB5F894D704092AC"/>
+ <TestFrame time="3480" hash="6CC9DE62A0C8FA5E42EAC1B01E99AC32"/>
+ <TestFrame time="3510" hash="D754D35D0793F9F7D4F6249A874E4C45"/>
+ <TestFrame time="3540" hash="B2C778A5EFF5F01EDC54F03D8B4DE8C7"/>
+ <TestFrame time="3570" hash="A4D9DFDBF32C0AD31794B04A2E23A0DB"/>
+ <TestFrame time="3600" hash="5025EB75C88F0760F637E0342B7F88A2"/>
+ <TestFrame time="3630" hash="F4732FF2DF93FE67CB850DEC34184924"/>
+ <TestFrame time="3660" hash="97566CE9558D13EA0780BCE233097B27"/>
+ <TestFrame time="3690" hash="2AD64CB01C9D50E0118D5ECE0A644DF2"/>
+ <TestFrame time="3720" hash="721D7061811B5439C2E8E395917494BC"/>
+ <TestFrame time="3750" hash="CE57E27AF329EBA4FAC3AB891F0407CE"/>
+ <TestFrame time="3780" hash="41BA853C3403F68A23E708DF82E21C53"/>
+ <TestFrame time="3810" hash="336D31586171F22D541B989D24B95CBB"/>
+ <TestFrame time="3840" hash="6D63FB5C8A80F0280E88B2CDF8641BB9"/>
+ <TestFrame time="3870" hash="EF8941674CB61F54853DC33652BB854E"/>
+ <TestFrame time="3900" hash="0C20D12464ABBDC45041EA5D9F2719B1"/>
+ <TestFrame time="3930" hash="53AE93140252373EAA4D9DA73756BD8E"/>
+ <TestFrame time="3960" hash="AF3120FE262D2489C0ED33FBBEE1549F"/>
+ <TestFrame time="3990" hash="A88A8129259F86DF5A73ADDC3649AD37"/>
+ <TestFrame time="4020" hash="3DB5E30EF19EA693C21CCF72892C4390"/>
+ <TestFrame time="4050" hash="E553F365912586C6408C8C53B1B7D118"/>
+ <TestFrame time="4080" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="4110" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="4140" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="4170" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="4200" hash="E553F365912586C6408C8C53B1B7D118"/>
+ <TestFrame time="4230" hash="3DB5E30EF19EA693C21CCF72892C4390"/>
+ <TestFrame time="4260" hash="A8B624EBFC9AB713D1CE55F318A6E90D"/>
+ <TestFrame time="4290" hash="AF3120FE262D2489C0ED33FBBEE1549F"/>
+ <TestFrame time="4320" hash="53AE93140252373EAA4D9DA73756BD8E"/>
+ <TestFrame time="4350" hash="BC426FB7C31751665B0D3F16E2CB0173"/>
+ <TestFrame time="4380" hash="DD60CBAFF6F34027474E92315DBC0EBC"/>
+ <TestFrame time="4410" hash="F0D8132489C2F2EF760E905B3C093726"/>
+ <TestFrame time="4440" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="4470" hash="DCF2867C127E041970047EC8F3EDC04F"/>
+ <TestFrame time="4500" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="4530" hash="41BA853C3403F68A23E708DF82E21C53"/>
+ <TestFrame time="4560" hash="CE57E27AF329EBA4FAC3AB891F0407CE"/>
+ <TestFrame time="4590" hash="A725B59B4947357546BBFC7DF3D830AF"/>
+ <TestFrame time="4620" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="4650" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="4680" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="4710" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="4740" hash="A725B59B4947357546BBFC7DF3D830AF"/>
+ <TestFrame time="4770" hash="CE57E27AF329EBA4FAC3AB891F0407CE"/>
+ <TestFrame time="4800" hash="41BA853C3403F68A23E708DF82E21C53"/>
+ <TestFrame time="4830" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="4860" hash="A350B70C5238A340E85FD4A3EC0390A3"/>
+ <TestFrame time="4890" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="4920" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="4950" hash="DCF2867C127E041970047EC8F3EDC04F"/>
+ <TestFrame time="4980" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="5010" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="5040" hash="A350B70C5238A340E85FD4A3EC0390A3"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/pauseAnimation/manifest.xml b/tests/auto/declarative/visual/pauseAnimation/manifest.xml
new file mode 100644
index 0000000..6b15341
--- /dev/null
+++ b/tests/auto/declarative/visual/pauseAnimation/manifest.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+ <TestFrame time="60" hash="0C20D12464ABBDC45041EA5D9F2719B1"/>
+ <TestFrame time="90" hash="6579681C59DD571DF0EE4429D74FB5C7"/>
+ <TestFrame time="120" hash="7DA50C2984E012F217DC44F79AD86D55"/>
+ <TestFrame time="150" hash="D5E2A4ABDCA59FA26FCE968AB11F0719"/>
+ <TestFrame time="180" hash="005ACBEF952A8EE536E6308A48223E65"/>
+ <TestFrame time="210" hash="C4F844EE71F23635BB3EC7375F6A134F"/>
+ <TestFrame time="240" hash="D9604BE23A91327E6AB454609A9D4A13"/>
+ <TestFrame time="270" hash="DA60100DC55023C3BAB367D97C8F6A85"/>
+ <TestFrame time="300" hash="79EC710576427DF73DD03F39FBA6E2EB"/>
+ <TestFrame time="330" hash="FFD39C1122FE2F7877EF30591B539B40"/>
+ <TestFrame time="360" hash="C1A7B7D6D64AC5584C073C2881290696"/>
+ <TestFrame time="390" hash="29ECE1BCA4D21FB5862091317D430A13"/>
+ <TestFrame time="420" hash="C1A7B7D6D64AC5584C073C2881290696"/>
+ <TestFrame time="450" hash="4AC43A03CC6F2020AB5F894D704092AC"/>
+ <TestFrame time="480" hash="6CC9DE62A0C8FA5E42EAC1B01E99AC32"/>
+ <TestFrame time="510" hash="D754D35D0793F9F7D4F6249A874E4C45"/>
+ <TestFrame time="540" hash="B2C778A5EFF5F01EDC54F03D8B4DE8C7"/>
+ <TestFrame time="570" hash="A4D9DFDBF32C0AD31794B04A2E23A0DB"/>
+ <TestFrame time="600" hash="5025EB75C88F0760F637E0342B7F88A2"/>
+ <TestFrame time="630" hash="F4732FF2DF93FE67CB850DEC34184924"/>
+ <TestFrame time="660" hash="97566CE9558D13EA0780BCE233097B27"/>
+ <TestFrame time="690" hash="2AD64CB01C9D50E0118D5ECE0A644DF2"/>
+ <TestFrame time="720" hash="721D7061811B5439C2E8E395917494BC"/>
+ <TestFrame time="750" hash="CE57E27AF329EBA4FAC3AB891F0407CE"/>
+ <TestFrame time="780" hash="41BA853C3403F68A23E708DF82E21C53"/>
+ <TestFrame time="810" hash="336D31586171F22D541B989D24B95CBB"/>
+ <TestFrame time="840" hash="6D63FB5C8A80F0280E88B2CDF8641BB9"/>
+ <TestFrame time="870" hash="EF8941674CB61F54853DC33652BB854E"/>
+ <TestFrame time="900" hash="0C20D12464ABBDC45041EA5D9F2719B1"/>
+ <TestFrame time="930" hash="53AE93140252373EAA4D9DA73756BD8E"/>
+ <TestFrame time="960" hash="AF3120FE262D2489C0ED33FBBEE1549F"/>
+ <TestFrame time="990" hash="A88A8129259F86DF5A73ADDC3649AD37"/>
+ <TestFrame time="1020" hash="3DB5E30EF19EA693C21CCF72892C4390"/>
+ <TestFrame time="1050" hash="E553F365912586C6408C8C53B1B7D118"/>
+ <TestFrame time="1080" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="1110" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="1140" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="1170" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="1200" hash="E553F365912586C6408C8C53B1B7D118"/>
+ <TestFrame time="1230" hash="3DB5E30EF19EA693C21CCF72892C4390"/>
+ <TestFrame time="1260" hash="A8B624EBFC9AB713D1CE55F318A6E90D"/>
+ <TestFrame time="1290" hash="AF3120FE262D2489C0ED33FBBEE1549F"/>
+ <TestFrame time="1320" hash="53AE93140252373EAA4D9DA73756BD8E"/>
+ <TestFrame time="1350" hash="BC426FB7C31751665B0D3F16E2CB0173"/>
+ <TestFrame time="1380" hash="DD60CBAFF6F34027474E92315DBC0EBC"/>
+ <TestFrame time="1410" hash="F0D8132489C2F2EF760E905B3C093726"/>
+ <TestFrame time="1440" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="1470" hash="DCF2867C127E041970047EC8F3EDC04F"/>
+ <TestFrame time="1500" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="1530" hash="41BA853C3403F68A23E708DF82E21C53"/>
+ <TestFrame time="1560" hash="CE57E27AF329EBA4FAC3AB891F0407CE"/>
+ <TestFrame time="1590" hash="A725B59B4947357546BBFC7DF3D830AF"/>
+ <TestFrame time="1620" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="1650" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="1680" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="1710" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="1740" hash="A725B59B4947357546BBFC7DF3D830AF"/>
+ <TestFrame time="1770" hash="CE57E27AF329EBA4FAC3AB891F0407CE"/>
+ <TestFrame time="1800" hash="41BA853C3403F68A23E708DF82E21C53"/>
+ <TestFrame time="1830" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="1860" hash="A350B70C5238A340E85FD4A3EC0390A3"/>
+ <TestFrame time="1890" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="1920" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="1950" hash="DCF2867C127E041970047EC8F3EDC04F"/>
+ <TestFrame time="1980" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="2010" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="2040" hash="A350B70C5238A340E85FD4A3EC0390A3"/>
+ <TestFrame time="3060" hash="0C20D12464ABBDC45041EA5D9F2719B1"/>
+ <TestFrame time="3090" hash="6579681C59DD571DF0EE4429D74FB5C7"/>
+ <TestFrame time="3120" hash="7DA50C2984E012F217DC44F79AD86D55"/>
+ <TestFrame time="3150" hash="D5E2A4ABDCA59FA26FCE968AB11F0719"/>
+ <TestFrame time="3180" hash="005ACBEF952A8EE536E6308A48223E65"/>
+ <TestFrame time="3210" hash="C4F844EE71F23635BB3EC7375F6A134F"/>
+ <TestFrame time="3240" hash="D9604BE23A91327E6AB454609A9D4A13"/>
+ <TestFrame time="3270" hash="DA60100DC55023C3BAB367D97C8F6A85"/>
+ <TestFrame time="3300" hash="79EC710576427DF73DD03F39FBA6E2EB"/>
+ <TestFrame time="3330" hash="FFD39C1122FE2F7877EF30591B539B40"/>
+ <TestFrame time="3360" hash="C1A7B7D6D64AC5584C073C2881290696"/>
+ <TestFrame time="3390" hash="29ECE1BCA4D21FB5862091317D430A13"/>
+ <TestFrame time="3420" hash="C1A7B7D6D64AC5584C073C2881290696"/>
+ <TestFrame time="3450" hash="4AC43A03CC6F2020AB5F894D704092AC"/>
+ <TestFrame time="3480" hash="6CC9DE62A0C8FA5E42EAC1B01E99AC32"/>
+ <TestFrame time="3510" hash="D754D35D0793F9F7D4F6249A874E4C45"/>
+ <TestFrame time="3540" hash="B2C778A5EFF5F01EDC54F03D8B4DE8C7"/>
+ <TestFrame time="3570" hash="A4D9DFDBF32C0AD31794B04A2E23A0DB"/>
+ <TestFrame time="3600" hash="5025EB75C88F0760F637E0342B7F88A2"/>
+ <TestFrame time="3630" hash="F4732FF2DF93FE67CB850DEC34184924"/>
+ <TestFrame time="3660" hash="97566CE9558D13EA0780BCE233097B27"/>
+ <TestFrame time="3690" hash="2AD64CB01C9D50E0118D5ECE0A644DF2"/>
+ <TestFrame time="3720" hash="721D7061811B5439C2E8E395917494BC"/>
+ <TestFrame time="3750" hash="CE57E27AF329EBA4FAC3AB891F0407CE"/>
+ <TestFrame time="3780" hash="41BA853C3403F68A23E708DF82E21C53"/>
+ <TestFrame time="3810" hash="336D31586171F22D541B989D24B95CBB"/>
+ <TestFrame time="3840" hash="6D63FB5C8A80F0280E88B2CDF8641BB9"/>
+ <TestFrame time="3870" hash="EF8941674CB61F54853DC33652BB854E"/>
+ <TestFrame time="3900" hash="0C20D12464ABBDC45041EA5D9F2719B1"/>
+ <TestFrame time="3930" hash="53AE93140252373EAA4D9DA73756BD8E"/>
+ <TestFrame time="3960" hash="AF3120FE262D2489C0ED33FBBEE1549F"/>
+ <TestFrame time="3990" hash="A88A8129259F86DF5A73ADDC3649AD37"/>
+ <TestFrame time="4020" hash="3DB5E30EF19EA693C21CCF72892C4390"/>
+ <TestFrame time="4050" hash="E553F365912586C6408C8C53B1B7D118"/>
+ <TestFrame time="4080" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="4110" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="4140" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="4170" hash="1373545E43FFF7251CEC9E8375EA267F"/>
+ <TestFrame time="4200" hash="E553F365912586C6408C8C53B1B7D118"/>
+ <TestFrame time="4230" hash="3DB5E30EF19EA693C21CCF72892C4390"/>
+ <TestFrame time="4260" hash="A8B624EBFC9AB713D1CE55F318A6E90D"/>
+ <TestFrame time="4290" hash="AF3120FE262D2489C0ED33FBBEE1549F"/>
+ <TestFrame time="4320" hash="53AE93140252373EAA4D9DA73756BD8E"/>
+ <TestFrame time="4350" hash="BC426FB7C31751665B0D3F16E2CB0173"/>
+ <TestFrame time="4380" hash="DD60CBAFF6F34027474E92315DBC0EBC"/>
+ <TestFrame time="4410" hash="F0D8132489C2F2EF760E905B3C093726"/>
+ <TestFrame time="4440" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="4470" hash="DCF2867C127E041970047EC8F3EDC04F"/>
+ <TestFrame time="4500" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="4530" hash="41BA853C3403F68A23E708DF82E21C53"/>
+ <TestFrame time="4560" hash="CE57E27AF329EBA4FAC3AB891F0407CE"/>
+ <TestFrame time="4590" hash="A725B59B4947357546BBFC7DF3D830AF"/>
+ <TestFrame time="4620" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="4650" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="4680" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="4710" hash="3042003C067B257DE2CB32F650DDE693"/>
+ <TestFrame time="4740" hash="A725B59B4947357546BBFC7DF3D830AF"/>
+ <TestFrame time="4770" hash="CE57E27AF329EBA4FAC3AB891F0407CE"/>
+ <TestFrame time="4800" hash="41BA853C3403F68A23E708DF82E21C53"/>
+ <TestFrame time="4830" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="4860" hash="A350B70C5238A340E85FD4A3EC0390A3"/>
+ <TestFrame time="4890" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="4920" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="4950" hash="DCF2867C127E041970047EC8F3EDC04F"/>
+ <TestFrame time="4980" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="5010" hash="675EBBDD22DD22CE45993DF4AF1ACFE9"/>
+ <TestFrame time="5040" hash="A350B70C5238A340E85FD4A3EC0390A3"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/pauseAnimation/pauseAnimation.xml b/tests/auto/declarative/visual/pauseAnimation/pauseAnimation.xml
new file mode 100644
index 0000000..bb411e2
--- /dev/null
+++ b/tests/auto/declarative/visual/pauseAnimation/pauseAnimation.xml
@@ -0,0 +1,13 @@
+<Rect id="rect" width="120" height="200" color="white">
+ <Image id="img" file="pics/qtlogo.png"
+ x="{60-img.width/2}" y="{200-img.height}">
+ <y>
+ <SerialAnimation running="true" repeat="true">
+ <NumericAnimation to="{200-img.height}"
+ easing="easeOutBounce(amplitude:100)"
+ duration="2000" />
+ <PauseAnimation duration="1000" />
+ </SerialAnimation>
+ </y>
+ </Image>
+</Rect>
diff --git a/tests/auto/declarative/visual/pauseAnimation/pics/qtlogo.png b/tests/auto/declarative/visual/pauseAnimation/pics/qtlogo.png
new file mode 100644
index 0000000..399bd0b
--- /dev/null
+++ b/tests/auto/declarative/visual/pauseAnimation/pics/qtlogo.png
Binary files differ
diff --git a/tests/auto/declarative/visual/qfxtext/elide/data/opengl/image0.png b/tests/auto/declarative/visual/qfxtext/elide/data/opengl/image0.png
new file mode 100644
index 0000000..7d45407
--- /dev/null
+++ b/tests/auto/declarative/visual/qfxtext/elide/data/opengl/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/qfxtext/elide/data/opengl/manifest.xml b/tests/auto/declarative/visual/qfxtext/elide/data/opengl/manifest.xml
new file mode 100644
index 0000000..b784f42
--- /dev/null
+++ b/tests/auto/declarative/visual/qfxtext/elide/data/opengl/manifest.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/qfxtext/elide/elide.xml b/tests/auto/declarative/visual/qfxtext/elide/elide.xml
new file mode 100644
index 0000000..398da82
--- /dev/null
+++ b/tests/auto/declarative/visual/qfxtext/elide/elide.xml
@@ -0,0 +1,6 @@
+<VerticalLayout width="80" height="{Text.height*4}">
+ <Text elide="ElideLeft" text="aaa bbb ccc ddd eee fff" width="80" color="white" id="Text"/>
+ <Text elide="ElideMiddle" text="aaa bbb ccc ddd eee fff" width="80" color="white"/>
+ <Text elide="ElideRight" text="aaa bbb ccc ddd eee fff" width="80" color="white"/>
+ <Text elide="ElideNone" text="aaa bbb ccc ddd eee fff" width="80" color="white"/>
+</VerticalLayout>
diff --git a/tests/auto/declarative/visual/qfxtext/elide/test b/tests/auto/declarative/visual/qfxtext/elide/test
new file mode 100644
index 0000000..d35cbc9
--- /dev/null
+++ b/tests/auto/declarative/visual/qfxtext/elide/test
@@ -0,0 +1 @@
+elide.xml
diff --git a/tests/auto/declarative/visual/repeater/basic1/basic1.xml b/tests/auto/declarative/visual/repeater/basic1/basic1.xml
new file mode 100644
index 0000000..def809f
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic1/basic1.xml
@@ -0,0 +1,21 @@
+<Rect color="blue" width="800" height="600" id="Page">
+ <HorizontalLayout>
+ <Repeater >
+ <component>
+ <Rect color="red" width="100" height="100">
+ <Text text="{name}" />
+ </Rect>
+ </component>
+ <dataSource>
+ <ListModel>
+ <Month>
+ <name>January</name>
+ </Month>
+ <Month>
+ <name>February</name>
+ </Month>
+ </ListModel>
+ </dataSource>
+ </Repeater>
+ </HorizontalLayout>
+</Rect>
diff --git a/tests/auto/declarative/visual/repeater/basic1/data/opengl/image0.png b/tests/auto/declarative/visual/repeater/basic1/data/opengl/image0.png
new file mode 100644
index 0000000..f0be97f
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic1/data/opengl/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/repeater/basic1/data/opengl/manifest.xml b/tests/auto/declarative/visual/repeater/basic1/data/opengl/manifest.xml
new file mode 100644
index 0000000..b784f42
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic1/data/opengl/manifest.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/repeater/basic1/test b/tests/auto/declarative/visual/repeater/basic1/test
new file mode 100644
index 0000000..62f0665
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic1/test
@@ -0,0 +1 @@
+basic1.xml
diff --git a/tests/auto/declarative/visual/repeater/basic2/basic2.xml b/tests/auto/declarative/visual/repeater/basic2/basic2.xml
new file mode 100644
index 0000000..b16fbfe
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic2/basic2.xml
@@ -0,0 +1,22 @@
+<Rect color="blue" width="800" height="600" id="Page">
+ <Component id="Delegate">
+ <Rect color="red" width="100" height="100">
+ <Text text="{name}" />
+ </Rect>
+ </Component>
+
+ <HorizontalLayout>
+ <Repeater component="{Delegate}">
+ <dataSource>
+ <ListModel>
+ <Month>
+ <name>January</name>
+ </Month>
+ <Month>
+ <name>February</name>
+ </Month>
+ </ListModel>
+ </dataSource>
+ </Repeater>
+ </HorizontalLayout>
+</Rect>
diff --git a/tests/auto/declarative/visual/repeater/basic2/data/opengl/image0.png b/tests/auto/declarative/visual/repeater/basic2/data/opengl/image0.png
new file mode 100644
index 0000000..f0be97f
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic2/data/opengl/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/repeater/basic2/data/opengl/manifest.xml b/tests/auto/declarative/visual/repeater/basic2/data/opengl/manifest.xml
new file mode 100644
index 0000000..b784f42
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic2/data/opengl/manifest.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/repeater/basic2/test b/tests/auto/declarative/visual/repeater/basic2/test
new file mode 100644
index 0000000..ae974fe
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic2/test
@@ -0,0 +1 @@
+basic2.xml
diff --git a/tests/auto/declarative/visual/repeater/basic3/basic3.xml b/tests/auto/declarative/visual/repeater/basic3/basic3.xml
new file mode 100644
index 0000000..1135f16
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic3/basic3.xml
@@ -0,0 +1,19 @@
+<Rect color="blue" width="800" height="600" id="Page">
+ <ListModel id="DataSource">
+ <Month>
+ <name>January</name>
+ </Month>
+ <Month>
+ <name>February</name>
+ </Month>
+ </ListModel>
+ <HorizontalLayout>
+ <Repeater dataSource="{DataSource}">
+ <component>
+ <Rect color="red" width="100" height="100">
+ <Text text="{name}" />
+ </Rect>
+ </component>
+ </Repeater>
+ </HorizontalLayout>
+</Rect>
diff --git a/tests/auto/declarative/visual/repeater/basic3/data/opengl/image0.png b/tests/auto/declarative/visual/repeater/basic3/data/opengl/image0.png
new file mode 100644
index 0000000..f0be97f
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic3/data/opengl/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/repeater/basic3/data/opengl/manifest.xml b/tests/auto/declarative/visual/repeater/basic3/data/opengl/manifest.xml
new file mode 100644
index 0000000..b784f42
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic3/data/opengl/manifest.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/repeater/basic3/test b/tests/auto/declarative/visual/repeater/basic3/test
new file mode 100644
index 0000000..ea3154e
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic3/test
@@ -0,0 +1 @@
+basic3.xml
diff --git a/tests/auto/declarative/visual/repeater/basic4/basic4.xml b/tests/auto/declarative/visual/repeater/basic4/basic4.xml
new file mode 100644
index 0000000..53b8ff9
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic4/basic4.xml
@@ -0,0 +1,18 @@
+<Rect color="blue" width="800" height="600" id="Page">
+ <ListModel id="DataSource">
+ <Month>
+ <name>January</name>
+ </Month>
+ <Month>
+ <name>February</name>
+ </Month>
+ </ListModel>
+ <Component id="Delegate">
+ <Rect color="red" width="100" height="100">
+ <Text text="{name}" />
+ </Rect>
+ </Component>
+ <HorizontalLayout>
+ <Repeater dataSource="{DataSource}" component="{Delegate}" />
+ </HorizontalLayout>
+</Rect>
diff --git a/tests/auto/declarative/visual/repeater/basic4/data/opengl/image0.png b/tests/auto/declarative/visual/repeater/basic4/data/opengl/image0.png
new file mode 100644
index 0000000..f0be97f
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic4/data/opengl/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/repeater/basic4/data/opengl/manifest.xml b/tests/auto/declarative/visual/repeater/basic4/data/opengl/manifest.xml
new file mode 100644
index 0000000..b784f42
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic4/data/opengl/manifest.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/repeater/basic4/test b/tests/auto/declarative/visual/repeater/basic4/test
new file mode 100644
index 0000000..891e0be
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/basic4/test
@@ -0,0 +1 @@
+basic4.xml
diff --git a/tests/auto/declarative/visual/runtests.sh b/tests/auto/declarative/visual/runtests.sh
new file mode 100755
index 0000000..f690381
--- /dev/null
+++ b/tests/auto/declarative/visual/runtests.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+for a in `cat tests`; do ./tst_visual -testdir $a; done
diff --git a/tests/auto/declarative/visual/tests b/tests/auto/declarative/visual/tests
new file mode 100644
index 0000000..ca72e9e
--- /dev/null
+++ b/tests/auto/declarative/visual/tests
@@ -0,0 +1,11 @@
+ListView/basic1
+ListView/basic2
+ListView/basic3
+ListView/basic4
+bindinganimation
+repeater/basic1
+repeater/basic2
+repeater/basic3
+repeater/basic4
+webview/autosize
+qfxtext/elide
diff --git a/tests/auto/declarative/visual/tst_visual.cpp b/tests/auto/declarative/visual/tst_visual.cpp
new file mode 100644
index 0000000..f077994
--- /dev/null
+++ b/tests/auto/declarative/visual/tst_visual.cpp
@@ -0,0 +1,72 @@
+#include <qtest.h>
+#include <QFxView>
+#include <QApplication>
+#include <QFxTestView>
+#include <QFile>
+
+static QString testdir;
+class tst_visual : public QObject
+{
+ Q_OBJECT
+public:
+ tst_visual() {}
+
+private slots:
+ void visual();
+};
+
+#ifdef QT_OPENGL_ES
+#define RASTER_TESTDIR "/data/opengl"
+#else
+#define RASTER_TESTDIR "/data/raster"
+#endif
+
+void tst_visual::visual()
+{
+ QVERIFY(!testdir.isEmpty());
+
+ QFile configFile(QLatin1String(QT_TEST_SOURCE_DIR) + "/" + testdir + "/test");
+ QVERIFY(configFile.open(QIODevice::ReadOnly));
+
+ QString testfile = configFile.readLine().trimmed();
+ QVERIFY(!testfile.isEmpty());
+
+ if(testfile.startsWith("QTDIR/")) {
+ testfile.remove(0, 6);
+ testfile.prepend(QLatin1String(QT_TEST_SOURCE_DIR) + "/../../../../");
+ } else {
+ testfile.prepend(QLatin1String(QT_TEST_SOURCE_DIR) + "/" + testdir + "/");
+ }
+
+ QFxTestView *view = new QFxTestView(testfile, QLatin1String(QT_TEST_SOURCE_DIR) + "/" + testdir + RASTER_TESTDIR);
+ QVERIFY(view->runTest());
+}
+
+#include <QtTest/qtest_gui.h>
+
+int main(int argc, char *argv[])
+{
+ int newArgc = 1;
+ char **newArgv = new char*[argc];
+
+ newArgv[0] = argv[0];
+
+ QApplication app(newArgc, newArgv);
+
+ for(int ii = 1; ii < argc; ii++) {
+ if(QLatin1String(argv[ii]) == "-testdir" && (ii + 1) < argc) {
+ testdir = QLatin1String(argv[ii + 1]);
+ ii++;
+ } else {
+ newArgv[newArgc++] = argv[ii];
+ }
+ }
+
+ tst_visual tc;
+ int rv = QTest::qExec(&tc, newArgc, newArgv);
+
+ delete [] newArgv;
+ return rv;
+}
+
+#include "tst_visual.moc"
diff --git a/tests/auto/declarative/visual/visual.pro b/tests/auto/declarative/visual/visual.pro
new file mode 100644
index 0000000..203b691
--- /dev/null
+++ b/tests/auto/declarative/visual/visual.pro
@@ -0,0 +1,5 @@
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative
+SOURCES += tst_visual.cpp
+
+DEFINES += QT_TEST_SOURCE_DIR=\"\\\"$$PWD\\\"\"
diff --git a/tests/auto/declarative/visual/webview/autosize/data/opengl/image0.png b/tests/auto/declarative/visual/webview/autosize/data/opengl/image0.png
new file mode 100644
index 0000000..351a7b7
--- /dev/null
+++ b/tests/auto/declarative/visual/webview/autosize/data/opengl/image0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/webview/autosize/data/opengl/manifest.xml b/tests/auto/declarative/visual/webview/autosize/data/opengl/manifest.xml
new file mode 100644
index 0000000..b784f42
--- /dev/null
+++ b/tests/auto/declarative/visual/webview/autosize/data/opengl/manifest.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestLog>
+ <TestFullFrame time="30" frameId="0"/>
+</TestLog>
diff --git a/tests/auto/declarative/visual/webview/autosize/test b/tests/auto/declarative/visual/webview/autosize/test
new file mode 100644
index 0000000..446d3f9
--- /dev/null
+++ b/tests/auto/declarative/visual/webview/autosize/test
@@ -0,0 +1 @@
+QTDIR/examples/declarative/webview/autosize.qml