Initial import from the monolithic Qt.
[profile/ivi/qtdeclarative.git] / tests / auto / declarative / qdeclarativeqt / tst_qdeclarativeqt.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 <private/qdeclarativeengine_p.h>
42
43 #include <qtest.h>
44 #include <QDebug>
45 #include <QDeclarativeEngine>
46 #include <QFontDatabase>
47 #include <QFileInfo>
48 #include <QDeclarativeComponent>
49 #include <QDesktopServices>
50 #include <QDir>
51 #include <QVector3D>
52 #include <QCryptographicHash>
53 #include <QDeclarativeItem>
54 #include <QSignalSpy>
55
56 #ifdef Q_OS_SYMBIAN
57 // In Symbian OS test data is located in applications private dir
58 #define SRCDIR "."
59 #endif
60
61 class tst_qdeclarativeqt : public QObject
62 {
63     Q_OBJECT
64 public:
65     tst_qdeclarativeqt() {}
66
67 private slots:
68     void enums();
69     void rgba();
70     void hsla();
71     void rect();
72     void point();
73     void size();
74     void vector();
75     void lighter();
76     void darker();
77     void tint();
78     void openUrlExternally();
79     void openUrlExternally_pragmaLibrary();
80     void md5();
81     void createComponent();
82     void createComponent_pragmaLibrary();
83     void createQmlObject();
84     void consoleLog();
85     void dateTimeFormatting();
86     void dateTimeFormatting_data();
87     void isQtObject();
88     void btoa();
89     void atob();
90     void fontFamilies();
91     void quit();
92
93 private:
94     QDeclarativeEngine engine;
95 };
96
97 inline QUrl TEST_FILE(const QString &filename)
98 {
99     return QUrl::fromLocalFile(QLatin1String(SRCDIR) + QLatin1String("/data/") + filename);
100 }
101
102 void tst_qdeclarativeqt::enums()
103 {
104     QDeclarativeComponent component(&engine, TEST_FILE("enums.qml"));
105     QObject *object = component.create();
106     QVERIFY(object != 0);
107
108     QCOMPARE(object->property("test1").toInt(), (int)Qt::Key_Escape);
109     QCOMPARE(object->property("test2").toInt(), (int)Qt::DescendingOrder);
110     QCOMPARE(object->property("test3").toInt(), (int)Qt::ElideMiddle);
111     QCOMPARE(object->property("test4").toInt(), (int)Qt::AlignRight);
112
113     delete object;
114 }
115
116 void tst_qdeclarativeqt::rgba()
117 {
118     QDeclarativeComponent component(&engine, TEST_FILE("rgba.qml"));
119
120     QString warning1 = component.url().toString() + ":6: Error: Qt.rgba(): Invalid arguments";
121     QString warning2 = component.url().toString() + ":7: Error: Qt.rgba(): Invalid arguments";
122     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
123     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
124
125     QObject *object = component.create();
126     QVERIFY(object != 0);
127
128
129     QCOMPARE(qvariant_cast<QColor>(object->property("test1")), QColor::fromRgbF(1, 0, 0, 0.8));
130     QCOMPARE(qvariant_cast<QColor>(object->property("test2")), QColor::fromRgbF(1, 0.5, 0.3, 1));
131     QCOMPARE(qvariant_cast<QColor>(object->property("test3")), QColor());
132     QCOMPARE(qvariant_cast<QColor>(object->property("test4")), QColor());
133     QCOMPARE(qvariant_cast<QColor>(object->property("test5")), QColor::fromRgbF(1, 1, 1, 1));
134     QCOMPARE(qvariant_cast<QColor>(object->property("test6")), QColor::fromRgbF(0, 0, 0, 0));
135
136     delete object;
137 }
138
139 void tst_qdeclarativeqt::hsla()
140 {
141     QDeclarativeComponent component(&engine, TEST_FILE("hsla.qml"));
142
143     QString warning1 = component.url().toString() + ":6: Error: Qt.hsla(): Invalid arguments";
144     QString warning2 = component.url().toString() + ":7: Error: Qt.hsla(): Invalid arguments";
145     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
146     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
147
148     QObject *object = component.create();
149     QVERIFY(object != 0);
150
151     QCOMPARE(qvariant_cast<QColor>(object->property("test1")), QColor::fromHslF(1, 0, 0, 0.8));
152     QCOMPARE(qvariant_cast<QColor>(object->property("test2")), QColor::fromHslF(1, 0.5, 0.3, 1));
153     QCOMPARE(qvariant_cast<QColor>(object->property("test3")), QColor());
154     QCOMPARE(qvariant_cast<QColor>(object->property("test4")), QColor());
155     QCOMPARE(qvariant_cast<QColor>(object->property("test5")), QColor::fromHslF(1, 1, 1, 1));
156     QCOMPARE(qvariant_cast<QColor>(object->property("test6")), QColor::fromHslF(0, 0, 0, 0));
157
158     delete object;
159 }
160
161 void tst_qdeclarativeqt::rect()
162 {
163     QDeclarativeComponent component(&engine, TEST_FILE("rect.qml"));
164
165     QString warning1 = component.url().toString() + ":6: Error: Qt.rect(): Invalid arguments";
166     QString warning2 = component.url().toString() + ":7: Error: Qt.rect(): Invalid arguments";
167     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
168     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
169
170     QObject *object = component.create();
171     QVERIFY(object != 0);
172
173     QCOMPARE(qvariant_cast<QRectF>(object->property("test1")), QRectF(10, 13, 100, 109));
174     QCOMPARE(qvariant_cast<QRectF>(object->property("test2")), QRectF(-10, 13, 100, 109.6));
175     QCOMPARE(qvariant_cast<QRectF>(object->property("test3")), QRectF());
176     QCOMPARE(qvariant_cast<QRectF>(object->property("test4")), QRectF());
177     QCOMPARE(qvariant_cast<QRectF>(object->property("test5")), QRectF());
178
179     delete object;
180 }
181
182 void tst_qdeclarativeqt::point()
183 {
184     QDeclarativeComponent component(&engine, TEST_FILE("point.qml"));
185
186     QString warning1 = component.url().toString() + ":6: Error: Qt.point(): Invalid arguments";
187     QString warning2 = component.url().toString() + ":7: Error: Qt.point(): Invalid arguments";
188     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
189     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
190
191     QObject *object = component.create();
192     QVERIFY(object != 0);
193
194     QCOMPARE(qvariant_cast<QPointF>(object->property("test1")), QPointF(19, 34));
195     QCOMPARE(qvariant_cast<QPointF>(object->property("test2")), QPointF(-3, 109.2));
196     QCOMPARE(qvariant_cast<QPointF>(object->property("test3")), QPointF());
197     QCOMPARE(qvariant_cast<QPointF>(object->property("test4")), QPointF());
198
199     delete object;
200 }
201
202 void tst_qdeclarativeqt::size()
203 {
204     QDeclarativeComponent component(&engine, TEST_FILE("size.qml"));
205
206     QString warning1 = component.url().toString() + ":7: Error: Qt.size(): Invalid arguments";
207     QString warning2 = component.url().toString() + ":8: Error: Qt.size(): Invalid arguments";
208     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
209     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
210
211     QObject *object = component.create();
212     QVERIFY(object != 0);
213
214     QCOMPARE(qvariant_cast<QSizeF>(object->property("test1")), QSizeF(19, 34));
215     QCOMPARE(qvariant_cast<QSizeF>(object->property("test2")), QSizeF(3, 109.2));
216     QCOMPARE(qvariant_cast<QSizeF>(object->property("test3")), QSizeF(-3, 10));
217     QCOMPARE(qvariant_cast<QSizeF>(object->property("test4")), QSizeF());
218     QCOMPARE(qvariant_cast<QSizeF>(object->property("test5")), QSizeF());
219
220     delete object;
221 }
222
223 void tst_qdeclarativeqt::vector()
224 {
225     QDeclarativeComponent component(&engine, TEST_FILE("vector.qml"));
226
227     QString warning1 = component.url().toString() + ":6: Error: Qt.vector(): Invalid arguments";
228     QString warning2 = component.url().toString() + ":7: Error: Qt.vector(): Invalid arguments";
229     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
230     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
231
232     QObject *object = component.create();
233     QVERIFY(object != 0);
234
235     QCOMPARE(qvariant_cast<QVector3D>(object->property("test1")), QVector3D(1, 0, 0.9));
236     QCOMPARE(qvariant_cast<QVector3D>(object->property("test2")), QVector3D(102, -10, -982.1));
237     QCOMPARE(qvariant_cast<QVector3D>(object->property("test3")), QVector3D());
238     QCOMPARE(qvariant_cast<QVector3D>(object->property("test4")), QVector3D());
239
240     delete object;
241 }
242
243 void tst_qdeclarativeqt::lighter()
244 {
245     QDeclarativeComponent component(&engine, TEST_FILE("lighter.qml"));
246
247     QString warning1 = component.url().toString() + ":5: Error: Qt.lighter(): Invalid arguments";
248     QString warning2 = component.url().toString() + ":10: Error: Qt.lighter(): Invalid arguments";
249     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
250     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
251
252     QObject *object = component.create();
253     QVERIFY(object != 0);
254
255     QCOMPARE(qvariant_cast<QColor>(object->property("test1")), QColor::fromRgbF(1, 0.8, 0.3).lighter());
256     QCOMPARE(qvariant_cast<QColor>(object->property("test2")), QColor());
257     QCOMPARE(qvariant_cast<QColor>(object->property("test3")), QColor::fromRgbF(1, 0.8, 0.3).lighter(180));
258     QCOMPARE(qvariant_cast<QColor>(object->property("test4")), QColor("red").lighter());
259     QCOMPARE(qvariant_cast<QColor>(object->property("test5")), QColor());
260     QCOMPARE(qvariant_cast<QColor>(object->property("test6")), QColor());
261
262     delete object;
263 }
264
265 void tst_qdeclarativeqt::darker()
266 {
267     QDeclarativeComponent component(&engine, TEST_FILE("darker.qml"));
268
269     QString warning1 = component.url().toString() + ":5: Error: Qt.darker(): Invalid arguments";
270     QString warning2 = component.url().toString() + ":10: Error: Qt.darker(): Invalid arguments";
271     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
272     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
273
274     QObject *object = component.create();
275     QVERIFY(object != 0);
276
277     QCOMPARE(qvariant_cast<QColor>(object->property("test1")), QColor::fromRgbF(1, 0.8, 0.3).darker());
278     QCOMPARE(qvariant_cast<QColor>(object->property("test2")), QColor());
279     QCOMPARE(qvariant_cast<QColor>(object->property("test3")), QColor::fromRgbF(1, 0.8, 0.3).darker(280));
280     QCOMPARE(qvariant_cast<QColor>(object->property("test4")), QColor("red").darker());
281     QCOMPARE(qvariant_cast<QColor>(object->property("test5")), QColor());
282     QCOMPARE(qvariant_cast<QColor>(object->property("test6")), QColor());
283
284     delete object;
285 }
286
287 void tst_qdeclarativeqt::tint()
288 {
289     QDeclarativeComponent component(&engine, TEST_FILE("tint.qml"));
290
291     QString warning1 = component.url().toString() + ":7: Error: Qt.tint(): Invalid arguments";
292     QString warning2 = component.url().toString() + ":8: Error: Qt.tint(): Invalid arguments";
293
294     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
295     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
296
297     QObject *object = component.create();
298     QVERIFY(object != 0);
299
300     QCOMPARE(qvariant_cast<QColor>(object->property("test1")), QColor::fromRgbF(0, 0, 1));
301     QCOMPARE(qvariant_cast<QColor>(object->property("test2")), QColor::fromRgbF(1, 0, 0));
302     QColor test3 = qvariant_cast<QColor>(object->property("test3"));
303     QCOMPARE(test3.rgba(), 0xFF7F0080);
304     QCOMPARE(qvariant_cast<QColor>(object->property("test4")), QColor());
305     QCOMPARE(qvariant_cast<QColor>(object->property("test5")), QColor());
306
307     delete object;
308 }
309
310 class MyUrlHandler : public QObject
311 {
312     Q_OBJECT
313 public:
314     MyUrlHandler() : called(0) { }
315     int called;
316     QUrl last;
317
318 public slots:
319     void noteCall(const QUrl &url) { called++; last = url; }
320 };
321
322 void tst_qdeclarativeqt::openUrlExternally()
323 {
324     MyUrlHandler handler;
325
326     QDesktopServices::setUrlHandler("test", &handler, "noteCall");
327     QDesktopServices::setUrlHandler("file", &handler, "noteCall");
328
329     QDeclarativeComponent component(&engine, TEST_FILE("openUrlExternally.qml"));
330     QObject *object = component.create();
331     QVERIFY(object != 0);
332     QCOMPARE(handler.called,1);
333     QCOMPARE(handler.last, QUrl("test:url"));
334
335     object->setProperty("testFile", true);
336
337     QCOMPARE(handler.called,2);
338     QCOMPARE(handler.last, TEST_FILE("test.html"));
339
340     QDesktopServices::unsetUrlHandler("test");
341     QDesktopServices::unsetUrlHandler("file");
342 }
343
344 void tst_qdeclarativeqt::openUrlExternally_pragmaLibrary()
345 {
346     MyUrlHandler handler;
347
348     QDesktopServices::setUrlHandler("test", &handler, "noteCall");
349     QDesktopServices::setUrlHandler("file", &handler, "noteCall");
350
351     QDeclarativeComponent component(&engine, TEST_FILE("openUrlExternally_lib.qml"));
352     QObject *object = component.create();
353     QVERIFY(object != 0);
354     QCOMPARE(handler.called,1);
355     QCOMPARE(handler.last, QUrl("test:url"));
356
357     object->setProperty("testFile", true);
358
359     QCOMPARE(handler.called,2);
360     QCOMPARE(handler.last, TEST_FILE("test.html"));
361
362     QDesktopServices::unsetUrlHandler("test");
363     QDesktopServices::unsetUrlHandler("file");
364 }
365
366 void tst_qdeclarativeqt::md5()
367 {
368     QDeclarativeComponent component(&engine, TEST_FILE("md5.qml"));
369
370     QString warning1 = component.url().toString() + ":4: Error: Qt.md5(): Invalid arguments";
371     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
372
373     QObject *object = component.create();
374     QVERIFY(object != 0);
375
376     QCOMPARE(object->property("test2").toString(), QLatin1String(QCryptographicHash::hash("Hello World", QCryptographicHash::Md5).toHex()));
377
378     delete object;
379 }
380
381 void tst_qdeclarativeqt::createComponent()
382 {
383     QDeclarativeComponent component(&engine, TEST_FILE("createComponent.qml"));
384
385     QString warning1 = component.url().toString() + ":9: Error: Qt.createComponent(): Invalid arguments";
386     QString warning2 = component.url().toString() + ":10: Error: Qt.createComponent(): Invalid arguments";
387     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
388     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
389
390     QObject *object = component.create();
391     QVERIFY(object != 0);
392
393     QCOMPARE(object->property("absoluteUrl").toString(), QString("http://www.example.com/test.qml"));
394     QCOMPARE(object->property("relativeUrl").toString(), TEST_FILE("createComponentData.qml").toString());
395
396     delete object;
397 }
398
399 void tst_qdeclarativeqt::createComponent_pragmaLibrary()
400 {
401     // Currently, just loading createComponent_lib.qml causes crash on some platforms
402     QDeclarativeComponent component(&engine, TEST_FILE("createComponent_lib.qml"));
403     QObject *object = component.create();
404     QVERIFY(object != 0);
405     QCOMPARE(object->property("status").toInt(), int(QDeclarativeComponent::Ready));
406     QCOMPARE(object->property("readValue").toInt(), int(1913));
407     delete object;
408 }
409
410 void tst_qdeclarativeqt::createQmlObject()
411 {
412     QDeclarativeComponent component(&engine, TEST_FILE("createQmlObject.qml"));
413
414     QString warning1 = component.url().toString() + ":7: Error: Qt.createQmlObject(): Invalid arguments";
415     QString warning2 = component.url().toString()+ ":10: Error: Qt.createQmlObject() failed to create object:     " + TEST_FILE("inline").toString() + ":2:10: Blah is not a type\n";
416     QString warning3 = component.url().toString()+ ":11: Error: Qt.createQmlObject() failed to create object:     " + TEST_FILE("main.qml").toString() + ":4:1: Duplicate property name\n";
417     QString warning4 = component.url().toString()+ ":9: Error: Qt.createQmlObject(): Missing parent object";
418     QString warning5 = component.url().toString()+ ":8: Error: Qt.createQmlObject(): Invalid arguments";
419     QString warning6 = "RunTimeError:  Qt.createQmlObject() failed to create object:     " + TEST_FILE("inline").toString() + ":3: Cannot assign object type QObject with no default method\n";
420
421     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
422     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
423     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning3));
424     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning4));
425     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning5));
426     QTest::ignoreMessage(QtDebugMsg, qPrintable(warning6));
427
428     QObject *object = component.create();
429     QVERIFY(object != 0);
430
431     QCOMPARE(object->property("emptyArg").toBool(), true);
432     QCOMPARE(object->property("success").toBool(), true);
433
434     QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(object);
435     QVERIFY(item != 0);
436     QVERIFY(item->childItems().count() == 1);
437
438     delete object;
439 }
440
441 void tst_qdeclarativeqt::consoleLog()
442 {
443     QTest::ignoreMessage(QtDebugMsg, "completed ok");
444     QTest::ignoreMessage(QtDebugMsg, "completed ok");
445     QDeclarativeComponent component(&engine, TEST_FILE("consoleLog.qml"));
446     QObject *object = component.create();
447     QVERIFY(object != 0);
448     delete object;
449 }
450
451 void tst_qdeclarativeqt::dateTimeFormatting()
452 {
453     QFETCH(QString, method);
454     QFETCH(QStringList, inputProperties);
455     QFETCH(QStringList, expectedResults);
456
457     QDate date(2008,12,24);
458     QTime time(14,15,38,200);
459     QDateTime dateTime(date, time);
460
461     QDeclarativeEngine eng;
462
463     eng.rootContext()->setContextProperty("qdate", date);
464     eng.rootContext()->setContextProperty("qtime", time);
465     eng.rootContext()->setContextProperty("qdatetime", dateTime);
466
467     QDeclarativeComponent component(&eng, TEST_FILE("formatting.qml"));
468
469     QStringList warnings;
470     warnings << component.url().toString() + ":37: Error: Qt.formatDate(): Invalid date format"
471         << component.url().toString() + ":36: Error: Qt.formatDate(): Invalid arguments"
472         << component.url().toString() + ":40: Error: Qt.formatTime(): Invalid time format"
473         << component.url().toString() + ":39: Error: Qt.formatTime(): Invalid arguments"
474         << component.url().toString() + ":43: Error: Qt.formatDateTime(): Invalid datetime format"
475         << component.url().toString() + ":42: Error: Qt.formatDateTime(): Invalid arguments";
476
477     foreach (const QString &warning, warnings)
478         QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
479
480     QObject *object = component.create();
481     QVERIFY2(component.errorString().isEmpty(), qPrintable(component.errorString()));
482     QVERIFY(object != 0);
483
484     QVERIFY(inputProperties.count() > 0);
485
486     QVariant result;
487     foreach(const QString &prop, inputProperties) {
488         QVERIFY(QMetaObject::invokeMethod(object, method.toUtf8().constData(),
489                 Q_RETURN_ARG(QVariant, result),
490                 Q_ARG(QVariant, prop)));
491
492         QStringList output = result.toStringList();
493         for (int i=0; i<output.count(); i++)
494             QCOMPARE(output[i], expectedResults[i]);
495     }
496
497     delete object;
498 }
499
500 void tst_qdeclarativeqt::dateTimeFormatting_data()
501 {
502     QTest::addColumn<QString>("method");
503     QTest::addColumn<QStringList>("inputProperties");
504     QTest::addColumn<QStringList>("expectedResults");
505
506     QDate date(2008,12,24);
507     QTime time(14,15,38,200);
508     QDateTime dateTime(date, time);
509
510     QTest::newRow("formatDate")
511         << "formatDate"
512         << (QStringList() << "dateFromString" << "jsdate" << "qdate" << "qdatetime")
513         << (QStringList() << date.toString(Qt::DefaultLocaleShortDate)
514                           << date.toString(Qt::DefaultLocaleLongDate)
515                           << date.toString("ddd MMMM d yy"));
516
517     QTest::newRow("formatTime")
518         << "formatTime"
519         << (QStringList() << "jsdate" << "qtime" << "qdatetime")
520         << (QStringList() << time.toString(Qt::DefaultLocaleShortDate)
521                           << time.toString(Qt::DefaultLocaleLongDate)
522                           << time.toString("H:m:s a")
523                           << time.toString("hh:mm:ss.zzz"));
524
525     QTest::newRow("formatDateTime")
526         << "formatDateTime"
527         << (QStringList() << "jsdate" << "qdatetime")
528         << (QStringList() << dateTime.toString(Qt::DefaultLocaleShortDate)
529                           << dateTime.toString(Qt::DefaultLocaleLongDate)
530                           << dateTime.toString("M/d/yy H:m:s a"));
531 }
532
533 void tst_qdeclarativeqt::isQtObject()
534 {
535     QDeclarativeComponent component(&engine, TEST_FILE("isQtObject.qml"));
536     QObject *object = component.create();
537     QVERIFY(object != 0);
538
539     QCOMPARE(object->property("test1").toBool(), true);
540     QCOMPARE(object->property("test2").toBool(), false);
541     QCOMPARE(object->property("test3").toBool(), false);
542     QCOMPARE(object->property("test4").toBool(), false);
543     QCOMPARE(object->property("test5").toBool(), false);
544
545     delete object;
546 }
547
548 void tst_qdeclarativeqt::btoa()
549 {
550     QDeclarativeComponent component(&engine, TEST_FILE("btoa.qml"));
551
552     QString warning1 = component.url().toString() + ":4: Error: Qt.btoa(): Invalid arguments";
553     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
554
555     QObject *object = component.create();
556     QVERIFY(object != 0);
557
558     QCOMPARE(object->property("test2").toString(), QString("SGVsbG8gd29ybGQh"));
559
560     delete object;
561 }
562
563 void tst_qdeclarativeqt::atob()
564 {
565     QDeclarativeComponent component(&engine, TEST_FILE("atob.qml"));
566
567     QString warning1 = component.url().toString() + ":4: Error: Qt.atob(): Invalid arguments";
568     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
569
570     QObject *object = component.create();
571     QVERIFY(object != 0);
572
573     QCOMPARE(object->property("test2").toString(), QString("Hello world!"));
574
575     delete object;
576 }
577
578 void tst_qdeclarativeqt::fontFamilies()
579 {
580     QDeclarativeComponent component(&engine, TEST_FILE("fontFamilies.qml"));
581
582     QString warning1 = component.url().toString() + ":4: Error: Qt.fontFamilies(): Invalid arguments";
583     QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
584
585     QObject *object = component.create();
586     QVERIFY(object != 0);
587
588     QFontDatabase database;
589     QCOMPARE(object->property("test2"), QVariant::fromValue(database.families()));
590
591     delete object;
592 }
593
594 void tst_qdeclarativeqt::quit()
595 {
596     QDeclarativeComponent component(&engine, TEST_FILE("quit.qml"));
597
598     QSignalSpy spy(&engine, SIGNAL(quit()));
599     QObject *object = component.create();
600     QVERIFY(object != 0);
601     QCOMPARE(spy.count(), 1);
602
603     delete object;
604 }
605
606 QTEST_MAIN(tst_qdeclarativeqt)
607
608 #include "tst_qdeclarativeqt.moc"