QQuickCanvas renames
[profile/ivi/qtdeclarative.git] / tests / auto / quick / qquickborderimage / tst_qquickborderimage.cpp
index 173f230..30994b7 100644 (file)
@@ -44,6 +44,7 @@
 #include <QTcpSocket>
 #include <QDir>
 #include <QPainter>
+#include <QSignalSpy>
 
 #include <QtQml/qqmlengine.h>
 #include <QtQml/qqmlcomponent.h>
@@ -60,6 +61,8 @@
 #define SERVER_PORT 14446
 #define SERVER_ADDR "http://127.0.0.1:14446"
 
+Q_DECLARE_METATYPE(QQuickImageBase::Status)
+
 class tst_qquickborderimage : public QQmlDataTest
 
 {
@@ -68,6 +71,7 @@ public:
     tst_qquickborderimage();
 
 private slots:
+    void cleanup();
     void noSource();
     void imageSource();
     void imageSource_data();
@@ -79,13 +83,26 @@ private slots:
     void sciSource();
     void sciSource_data();
     void invalidSciFile();
+    void validSciFiles_data();
+    void validSciFiles();
     void pendingRemoteRequest();
     void pendingRemoteRequest_data();
+    void statusChanges();
+    void statusChanges_data();
+    void sourceSizeChanges();
+    void progressAndStatusChanges();
 
 private:
     QQmlEngine engine;
 };
 
+void tst_qquickborderimage::cleanup()
+{
+    QQuickWindow window;
+    window.releaseResources();
+    engine.clearComponentCache();
+}
+
 tst_qquickborderimage::tst_qquickborderimage()
 {
 }
@@ -181,6 +198,8 @@ void tst_qquickborderimage::clearSource()
     QVERIFY(obj->status() == QQuickBorderImage::Null);
     QCOMPARE(obj->width(), 0.);
     QCOMPARE(obj->height(), 0.);
+
+    delete obj;
 }
 
 void tst_qquickborderimage::resized()
@@ -218,12 +237,12 @@ void tst_qquickborderimage::smooth()
 
 void tst_qquickborderimage::mirror()
 {
-    QQuickView *canvas = new QQuickView;
-    canvas->setSource(testFileUrl("mirror.qml"));
-    QQuickBorderImage *image = qobject_cast<QQuickBorderImage*>(canvas->rootObject());
+    QQuickView *window = new QQuickView;
+    window->setSource(testFileUrl("mirror.qml"));
+    QQuickBorderImage *image = qobject_cast<QQuickBorderImage*>(window->rootObject());
     QVERIFY(image != 0);
 
-    QImage screenshot = canvas->grabFrameBuffer();
+    QImage screenshot = window->grabWindow();
 
     QImage srcPixmap(screenshot);
     QTransform transform;
@@ -231,10 +250,10 @@ void tst_qquickborderimage::mirror()
     srcPixmap = srcPixmap.transformed(transform);
 
     image->setProperty("mirror", true);
-    screenshot = canvas->grabFrameBuffer();
+    screenshot = window->grabWindow();
     QCOMPARE(screenshot, srcPixmap);
 
-    delete canvas;
+    delete window;
 }
 
 void tst_qquickborderimage::tileModes()
@@ -342,6 +361,33 @@ void tst_qquickborderimage::invalidSciFile()
     delete obj;
 }
 
+void tst_qquickborderimage::validSciFiles_data()
+{
+    QTest::addColumn<QString>("source");
+
+    QTest::newRow("valid1") << testFileUrl("valid1.sci").toString();
+    QTest::newRow("valid2") << testFileUrl("valid2.sci").toString();
+    QTest::newRow("valid3") << testFileUrl("valid3.sci").toString();
+    QTest::newRow("valid4") << testFileUrl("valid4.sci").toString();
+}
+
+void tst_qquickborderimage::validSciFiles()
+{
+    QFETCH(QString, source);
+
+    QString componentStr = "import QtQuick 2.0\nBorderImage { source: \"" + source +"\"; width: 300; height: 300 }";
+    QQmlComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QQuickBorderImage *obj = qobject_cast<QQuickBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+    QCOMPARE(obj->width(), 300.);
+    QCOMPARE(obj->height(), 300.);
+    QCOMPARE(obj->horizontalTileMode(), QQuickBorderImage::Round);
+    QCOMPARE(obj->verticalTileMode(), QQuickBorderImage::Repeat);
+
+    delete obj;
+}
+
 void tst_qquickborderimage::pendingRemoteRequest()
 {
     QFETCH(QString, source);
@@ -367,6 +413,175 @@ void tst_qquickborderimage::pendingRemoteRequest_data()
     QTest::newRow("sci file") << "http://localhost/none.sci";
 }
 
+//QTBUG-26155
+void tst_qquickborderimage::statusChanges_data()
+{
+    QTest::addColumn<QString>("source");
+    QTest::addColumn<int>("emissions");
+    QTest::addColumn<bool>("remote");
+    QTest::addColumn<QQuickImageBase::Status>("finalStatus");
+
+    QTest::newRow("localfile") << testFileUrl("colors.png").toString() << 1 << false << QQuickImageBase::Ready;
+    QTest::newRow("nofile") << "" << 0 << false << QQuickImageBase::Null;
+    QTest::newRow("nonexistent") << testFileUrl("thisfiledoesnotexist.png").toString() << 1 << false << QQuickImageBase::Error;
+    QTest::newRow("noprotocol") << QString("thisfiledoesnotexisteither.png") << 2 << false << QQuickImageBase::Error;
+    QTest::newRow("remote") << "http://localhost:14446/colors.png" << 2 << true << QQuickImageBase::Ready;
+}
+
+void tst_qquickborderimage::statusChanges()
+{
+    QFETCH(QString, source);
+    QFETCH(int, emissions);
+    QFETCH(bool, remote);
+    QFETCH(QQuickImageBase::Status, finalStatus);
+
+    TestHTTPServer *server = 0;
+    if (remote) {
+        server = new TestHTTPServer(SERVER_PORT);
+        QVERIFY(server->isValid());
+        server->serveDirectory(dataDirectory(), TestHTTPServer::Delay);
+    }
+
+    QString componentStr = "import QtQuick 2.0\nBorderImage { width: 300; height: 300 }";
+    QQmlComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl(""));
+
+    QQuickBorderImage *obj = qobject_cast<QQuickBorderImage*>(component.create());
+    qRegisterMetaType<QQuickImageBase::Status>();
+    QSignalSpy spy(obj, SIGNAL(statusChanged(QQuickImageBase::Status)));
+    QVERIFY(obj != 0);
+    obj->setSource(source);
+    QTRY_VERIFY(obj->status() == finalStatus);
+    QCOMPARE(spy.count(), emissions);
+
+    delete obj;
+    delete server;
+}
+
+void tst_qquickborderimage::sourceSizeChanges()
+{
+    TestHTTPServer server(14449);
+    QVERIFY(server.isValid());
+    server.serveDirectory(dataDirectory());
+
+    QQmlEngine engine;
+    QQmlComponent component(&engine);
+    component.setData("import QtQuick 2.0\nBorderImage { source: srcImage }", QUrl::fromLocalFile(""));
+    QTRY_VERIFY(component.isReady());
+    QQmlContext *ctxt = engine.rootContext();
+    ctxt->setContextProperty("srcImage", "");
+    QQuickBorderImage *obj = qobject_cast<QQuickBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+
+    QSignalSpy sourceSizeSpy(obj, SIGNAL(sourceSizeChanged()));
+
+    // Local
+    ctxt->setContextProperty("srcImage", QUrl(""));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Null);
+    QTRY_COMPARE(sourceSizeSpy.count(), 0);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("heart200.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 1);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("heart200.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 1);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("heart200_copy.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 1);
+
+    ctxt->setContextProperty("srcImage", testFileUrl("colors.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 2);
+
+    ctxt->setContextProperty("srcImage", QUrl(""));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Null);
+    QTRY_COMPARE(sourceSizeSpy.count(), 3);
+
+    // Remote
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/heart200.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 4);
+
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/heart200.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 4);
+
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/heart200_copy.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 4);
+
+    ctxt->setContextProperty("srcImage", QUrl("http://127.0.0.1:14449/colors.png"));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Ready);
+    QTRY_COMPARE(sourceSizeSpy.count(), 5);
+
+    ctxt->setContextProperty("srcImage", QUrl(""));
+    QTRY_COMPARE(obj->status(), QQuickBorderImage::Null);
+    QTRY_COMPARE(sourceSizeSpy.count(), 6);
+
+    delete obj;
+}
+
+void tst_qquickborderimage::progressAndStatusChanges()
+{
+    TestHTTPServer server(14449);
+    QVERIFY(server.isValid());
+    server.serveDirectory(dataDirectory());
+
+    QQmlEngine engine;
+    QString componentStr = "import QtQuick 2.0\nBorderImage { source: srcImage }";
+    QQmlContext *ctxt = engine.rootContext();
+    ctxt->setContextProperty("srcImage", testFileUrl("heart200.png"));
+    QQmlComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QQuickBorderImage *obj = qobject_cast<QQuickBorderImage*>(component.create());
+    QVERIFY(obj != 0);
+    QVERIFY(obj->status() == QQuickBorderImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+
+    qRegisterMetaType<QQuickBorderImage::Status>();
+    QSignalSpy sourceSpy(obj, SIGNAL(sourceChanged(const QUrl &)));
+    QSignalSpy progressSpy(obj, SIGNAL(progressChanged(qreal)));
+    QSignalSpy statusSpy(obj, SIGNAL(statusChanged(QQuickImageBase::Status)));
+
+    // Same file
+    ctxt->setContextProperty("srcImage", testFileUrl("heart200.png"));
+    QTRY_VERIFY(obj->status() == QQuickBorderImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 0);
+    QTRY_COMPARE(progressSpy.count(), 0);
+    QTRY_COMPARE(statusSpy.count(), 0);
+
+    // Loading local file
+    ctxt->setContextProperty("srcImage", testFileUrl("colors.png"));
+    QTRY_VERIFY(obj->status() == QQuickBorderImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 1);
+    QTRY_COMPARE(progressSpy.count(), 0);
+    QTRY_COMPARE(statusSpy.count(), 1);
+
+    // Loading remote file
+    ctxt->setContextProperty("srcImage", "http://127.0.0.1:14449/heart200.png");
+    QTRY_VERIFY(obj->status() == QQuickBorderImage::Loading);
+    QTRY_VERIFY(obj->progress() == 0.0);
+    QTRY_VERIFY(obj->status() == QQuickBorderImage::Ready);
+    QTRY_VERIFY(obj->progress() == 1.0);
+    QTRY_COMPARE(sourceSpy.count(), 2);
+    QTRY_VERIFY(progressSpy.count() > 1);
+    QTRY_COMPARE(statusSpy.count(), 3);
+
+    ctxt->setContextProperty("srcImage", "");
+    QTRY_VERIFY(obj->status() == QQuickBorderImage::Null);
+    QTRY_VERIFY(obj->progress() == 0.0);
+    QTRY_COMPARE(sourceSpy.count(), 3);
+    QTRY_VERIFY(progressSpy.count() > 2);
+    QTRY_COMPARE(statusSpy.count(), 4);
+
+    delete obj;
+}
+
 QTEST_MAIN(tst_qquickborderimage)
 
 #include "tst_qquickborderimage.moc"