Add test for importing plugins that contain QML files
[qt:qt.git] / tests / auto / declarative / qdeclarativemoduleplugin / tst_qdeclarativemoduleplugin.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the test suite of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file.  Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23 **
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 #include <qtest.h>
42 #include <qdir.h>
43 #include <QtDeclarative/qdeclarativeengine.h>
44 #include <QtDeclarative/qdeclarativecomponent.h>
45 #include <QDebug>
46
47 class tst_qdeclarativemoduleplugin : public QObject
48 {
49     Q_OBJECT
50 public:
51     tst_qdeclarativemoduleplugin()
52     {
53     }
54
55 private slots:
56     void importsPlugin();
57     void importsPlugin2();
58     void importsPlugin21();
59     void incorrectPluginCase();
60     void importPluginWithQmlFile();
61 };
62
63 #ifdef Q_OS_SYMBIAN
64 // In Symbian OS test data is located in applications private dir
65 #define SRCDIR "."
66 #endif
67
68 #define VERIFY_ERRORS(errorfile) \
69     if (!errorfile) { \
70         if (qgetenv("DEBUG") != "" && !component.errors().isEmpty()) \
71             qWarning() << "Unexpected Errors:" << component.errors(); \
72         QVERIFY(!component.isError()); \
73         QVERIFY(component.errors().isEmpty()); \
74     } else { \
75         QFile file(QLatin1String("data/") + QLatin1String(errorfile)); \
76         QVERIFY(file.open(QIODevice::ReadOnly)); \
77         QByteArray data = file.readAll(); \
78         file.close(); \
79         QList<QByteArray> expected = data.split('\n'); \
80         expected.removeAll(QByteArray("")); \
81         QList<QDeclarativeError> errors = component.errors(); \
82         QList<QByteArray> actual; \
83         for (int ii = 0; ii < errors.count(); ++ii) { \
84             const QDeclarativeError &error = errors.at(ii); \
85             QByteArray errorStr = QByteArray::number(error.line()) + ":" +  \
86                                   QByteArray::number(error.column()) + ":" + \
87                                   error.description().toUtf8(); \
88             actual << errorStr; \
89         } \
90         if (qgetenv("DEBUG") != "" && expected != actual) \
91             qWarning() << "Expected:" << expected << "Actual:" << actual;  \
92         if (qgetenv("QDECLARATIVELANGUAGE_UPDATEERRORS") != "" && expected != actual) {\
93             QFile file(QLatin1String("data/") + QLatin1String(errorfile)); \
94             QVERIFY(file.open(QIODevice::WriteOnly)); \
95             for (int ii = 0; ii < actual.count(); ++ii) { \
96                 file.write(actual.at(ii)); file.write("\n"); \
97             } \
98             file.close(); \
99         } else { \
100             QCOMPARE(expected, actual); \
101         } \
102     }
103
104 inline QUrl TEST_FILE(const QString &filename)
105 {
106     QFileInfo fileInfo(__FILE__);
107     return QUrl::fromLocalFile(fileInfo.absoluteDir().filePath(filename));
108 }
109
110
111 void tst_qdeclarativemoduleplugin::importsPlugin()
112 {
113     QDeclarativeEngine engine;
114     engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports"));
115     QTest::ignoreMessage(QtWarningMsg, "plugin created");
116     QTest::ignoreMessage(QtWarningMsg, "import worked");
117     QDeclarativeComponent component(&engine, TEST_FILE("data/works.qml"));
118     foreach (QDeclarativeError err, component.errors())
119         qWarning() << err;
120     VERIFY_ERRORS(0);
121     QObject *object = component.create();
122     QVERIFY(object != 0);
123     QCOMPARE(object->property("value").toInt(),123);
124     delete object;
125 }
126
127 void tst_qdeclarativemoduleplugin::importsPlugin2()
128 {
129     QDeclarativeEngine engine;
130     engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports"));
131     QTest::ignoreMessage(QtWarningMsg, "plugin2 created");
132     QTest::ignoreMessage(QtWarningMsg, "import2 worked");
133     QDeclarativeComponent component(&engine, TEST_FILE("data/works2.qml"));
134     foreach (QDeclarativeError err, component.errors())
135         qWarning() << err;
136     VERIFY_ERRORS(0);
137     QObject *object = component.create();
138     QVERIFY(object != 0);
139     QCOMPARE(object->property("value").toInt(),123);
140     delete object;
141 }
142
143 void tst_qdeclarativemoduleplugin::importsPlugin21()
144 {
145     QDeclarativeEngine engine;
146     engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports"));
147     QTest::ignoreMessage(QtWarningMsg, "plugin2.1 created");
148     QTest::ignoreMessage(QtWarningMsg, "import2.1 worked");
149     QDeclarativeComponent component(&engine, TEST_FILE("data/works21.qml"));
150     foreach (QDeclarativeError err, component.errors())
151         qWarning() << err;
152     VERIFY_ERRORS(0);
153     QObject *object = component.create();
154     QVERIFY(object != 0);
155     QCOMPARE(object->property("value").toInt(),123);
156     delete object;
157 }
158
159 void tst_qdeclarativemoduleplugin::incorrectPluginCase()
160 {
161     QDeclarativeEngine engine;
162     engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports"));
163
164     QDeclarativeComponent component(&engine, TEST_FILE("data/incorrectCase.qml"));
165
166     QList<QDeclarativeError> errors = component.errors();
167     QCOMPARE(errors.count(), 1);
168
169 #if defined(Q_OS_MAC) || defined(Q_OS_WIN32)
170 #if defined(Q_OS_MAC)
171     QString libname = "libPluGin.dylib";
172 #elif defined(Q_OS_WIN32)
173     QString libname = "PluGin.dll";
174 #endif
175     QString expectedError = QLatin1String("plugin cannot be loaded for module \"com.nokia.WrongCase\": File name case mismatch for \"") + QFileInfo(__FILE__).absoluteDir().filePath("imports/com/nokia/WrongCase/" + libname) + QLatin1String("\"");
176 #else
177     QString expectedError = QLatin1String("module \"com.nokia.WrongCase\" plugin \"PluGin\" not found");
178 #endif
179
180     QCOMPARE(errors.at(0).description(), expectedError);
181 }
182
183 void tst_qdeclarativemoduleplugin::importPluginWithQmlFile()
184 {
185     QDeclarativeEngine engine;
186     engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports"));
187     QDeclarativeComponent component(&engine, TEST_FILE("data/pluginWithQmlFile.qml"));
188     foreach (QDeclarativeError err, component.errors())
189         qWarning() << err;
190     VERIFY_ERRORS(0);
191     QObject *object = component.create();
192     QVERIFY(object != 0);
193     delete object;
194 }
195
196 QTEST_MAIN(tst_qdeclarativemoduleplugin)
197
198 #include "tst_qdeclarativemoduleplugin.moc"