aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/qml/qqmlbundle/tst_qqmlbundle.cpp
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2012-04-10 18:11:30 +0100
committerQt by Nokia <qt-info@nokia.com>2012-05-04 13:15:01 +0200
commit6f3bda0dce945a5fc75d8ebad302820fe9979d9b (patch)
tree6581aad8a7fb21ccbebe09d23c30af0e3236e266 /tests/auto/qml/qqmlbundle/tst_qqmlbundle.cpp
parent44f9412bf789d73dd462292038686f5b07026132 (diff)
Initial bundle support
Change-Id: I095249f64ecf4ef1e3fbfb164e3d50edffab61e8 Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
Diffstat (limited to 'tests/auto/qml/qqmlbundle/tst_qqmlbundle.cpp')
-rw-r--r--tests/auto/qml/qqmlbundle/tst_qqmlbundle.cpp260
1 files changed, 260 insertions, 0 deletions
diff --git a/tests/auto/qml/qqmlbundle/tst_qqmlbundle.cpp b/tests/auto/qml/qqmlbundle/tst_qqmlbundle.cpp
new file mode 100644
index 0000000000..fee01c2bf3
--- /dev/null
+++ b/tests/auto/qml/qqmlbundle/tst_qqmlbundle.cpp
@@ -0,0 +1,260 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// Lookup of libraries
+// Test bundle as a qmldir
+
+#include <qtest.h>
+#include <QDebug>
+#include <QQmlEngine>
+#include <QQmlComponent>
+#include "../../shared/util.h"
+#include <private/qqmlbundle_p.h>
+
+class tst_qqmlbundle : public QQmlDataTest
+{
+ Q_OBJECT
+public:
+ tst_qqmlbundle() {}
+
+private slots:
+ void initTestCase();
+
+ void componentFromBundle();
+ void relativeResolution();
+ void bundleImport();
+ void relativeQmldir();
+
+ void import();
+
+private:
+ QStringList findFiles(const QDir &d);
+ bool makeBundle(const QString &path, const QString &name);
+};
+
+void tst_qqmlbundle::initTestCase()
+{
+ QQmlDataTest::initTestCase();
+}
+
+// Test we create a QQmlComponent for a file inside a bundle
+void tst_qqmlbundle::componentFromBundle()
+{
+ QVERIFY(makeBundle(testFile("componentFromBundle"), "my.bundle"));
+
+ QQmlEngine engine;
+ engine.addNamedBundle("mybundle", testFile("componentFromBundle/my.bundle"));
+
+ QQmlComponent component(&engine, QUrl("bundle://mybundle/test.qml"));
+ QVERIFY(component.isReady());
+
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test1").toInt(), 11);
+ QCOMPARE(o->property("test2").toBool(), true);
+
+ delete o;
+}
+
+// Tests that relative QML components are resolved without a qmldir
+void tst_qqmlbundle::relativeResolution()
+{
+ // Root of the bundle
+ {
+ QVERIFY(makeBundle(testFile("relativeResolution.1"), "my.bundle"));
+
+ QQmlEngine engine;
+ engine.addNamedBundle("mybundle", testFile("relativeResolution.1/my.bundle"));
+
+ QQmlComponent component(&engine, QUrl("bundle://mybundle/test.qml"));
+ QVERIFY(component.isReady());
+
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test1").toInt(), 11);
+ QCOMPARE(o->property("test2").toBool(), true);
+
+ delete o;
+ }
+
+ // Non-root of the bundle
+ {
+ QVERIFY(makeBundle(testFile("relativeResolution.2"), "my.bundle"));
+
+ QQmlEngine engine;
+ engine.addNamedBundle("mybundle", testFile("relativeResolution.2/my.bundle"));
+
+ QQmlComponent component(&engine, QUrl("bundle://mybundle/subdir/test.qml"));
+ QVERIFY(component.isReady());
+
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test1").toInt(), 11);
+ QCOMPARE(o->property("test2").toBool(), true);
+
+ delete o;
+ }
+}
+
+// Test that a bundle can be imported explicitly from outside a bundle
+void tst_qqmlbundle::bundleImport()
+{
+ QVERIFY(makeBundle(testFile("bundleImport"), "my.bundle"));
+
+ QQmlEngine engine;
+ engine.addNamedBundle("mybundle", testFile("bundleImport/my.bundle"));
+
+ {
+ QQmlComponent component(&engine, testFileUrl("bundleImport/bundleImport.1.qml"));
+ QVERIFY(component.isReady());
+
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test1").toReal(), qreal(1918));
+ QCOMPARE(o->property("test2").toString(), QString("Hello world!"));
+
+ delete o;
+ }
+
+ {
+ QQmlComponent component(&engine, testFileUrl("bundleImport/bundleImport.2.qml"));
+ QVERIFY(component.isReady());
+
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test1").toReal(), qreal(1432));
+ QCOMPARE(o->property("test2").toString(), QString("Jeronimo"));
+
+ delete o;
+ }
+}
+
+// Test a relative import inside a bundle uses qmldir
+void tst_qqmlbundle::relativeQmldir()
+{
+ QVERIFY(makeBundle(testFile("relativeQmldir"), "my.bundle"));
+
+ QQmlEngine engine;
+ engine.addNamedBundle("mybundle", testFile("relativeQmldir/my.bundle"));
+
+ QQmlComponent component(&engine, QUrl("bundle://mybundle/test.qml"));
+ QVERIFY(component.isReady());
+
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("test1").toReal(), qreal(67));
+ QCOMPARE(o->property("test2").toReal(), qreal(88));
+
+ delete o;
+}
+
+// Test C++ plugins are resolved relative to the bundle container file
+void tst_qqmlbundle::import()
+{
+ QVERIFY(makeBundle(testFile("imports/bundletest"), "qmldir"));
+
+ QQmlEngine engine;
+ engine.addImportPath(testFile("imports"));
+
+ QQmlComponent component(&engine, testFileUrl("import.qml"));
+ QVERIFY(component.isReady());
+
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ QCOMPARE(o->property("value").toInt(), 32);
+
+ delete o;
+}
+
+// Transform the data available under <path>/bundledata to a bundle named <path>/<name>
+bool tst_qqmlbundle::makeBundle(const QString &path, const QString &name)
+{
+ QDir dir(path);
+ dir.remove(name);
+
+ QDir bundleDir = dir;
+ if (!bundleDir.cd("bundledata"))
+ return false;
+
+ QStringList fileNames = findFiles(bundleDir);
+
+ QString bundleFile = dir.absolutePath() + QDir::separator() + name;
+
+ QQmlBundle bundle(bundleFile);
+ if (!bundle.open(QFile::WriteOnly))
+ return false;
+
+ foreach (const QString &fileName, fileNames) {
+ QString shortFileName = fileName.mid(bundleDir.absolutePath().length() + 1);
+ bundle.add(shortFileName, fileName);
+ }
+
+ return true;
+}
+
+QStringList tst_qqmlbundle::findFiles(const QDir &d)
+{
+ QStringList rv;
+
+ QStringList files = d.entryList(QDir::Files);
+ foreach (const QString &file, files)
+ rv << d.absoluteFilePath(file);
+
+ QStringList dirs = d.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks);
+ foreach (const QString &dir, dirs) {
+ QDir sub = d;
+ sub.cd(dir);
+ rv << findFiles(sub);
+ }
+
+ return rv;
+}
+
+QTEST_MAIN(tst_qqmlbundle)
+
+#include "tst_qqmlbundle.moc"