1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the test suite of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 as published by the Free Software
20** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21** included in the packaging of this file. Please review the following
22** information to ensure the GNU General Public License requirements will
23** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24**
25** $QT_END_LICENSE$
26**
27****************************************************************************/
28#include <qtest.h>
29#include <QtTest/QSignalSpy>
30#include <QtQml/qqmlengine.h>
31#include <QtQml/qqmlcomponent.h>
32#include <QtQml/qqmlcontext.h>
33#include <QtQuick/private/qquickfontloader_p.h>
34#include "../../shared/util.h"
35#include "../../shared/testhttpserver.h"
36#include <QtQuick/QQuickView>
37#include <QtQuick/QQuickItem>
38
39class tst_qquickfontloader : public QQmlDataTest
40{
41 Q_OBJECT
42public:
43 tst_qquickfontloader();
44
45private slots:
46 void initTestCase();
47 void noFont();
48 void namedFont();
49 void localFont();
50 void failLocalFont();
51 void webFont();
52 void redirWebFont();
53 void failWebFont();
54 void changeFont();
55 void changeFontSourceViaState();
56
57private:
58 QQmlEngine engine;
59 TestHTTPServer server;
60};
61
62tst_qquickfontloader::tst_qquickfontloader()
63{
64}
65
66void tst_qquickfontloader::initTestCase()
67{
68 QQmlDataTest::initTestCase();
69 server.serveDirectory(dataDirectory());
70 QVERIFY2(server.listen(), qPrintable(server.errorString()));
71}
72
73void tst_qquickfontloader::noFont()
74{
75 QString componentStr = "import QtQuick 2.0\nFontLoader { }";
76 QQmlComponent component(&engine);
77 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
78 QQuickFontLoader *fontObject = qobject_cast<QQuickFontLoader*>(object: component.create());
79
80 QVERIFY(fontObject != nullptr);
81 QCOMPARE(fontObject->name(), QString(""));
82 QCOMPARE(fontObject->source(), QUrl(""));
83 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Null);
84
85 delete fontObject;
86}
87
88void tst_qquickfontloader::namedFont()
89{
90 QString componentStr = "import QtQuick 2.0\nFontLoader { name: \"Helvetica\" }";
91 QQmlComponent component(&engine);
92 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
93 QQuickFontLoader *fontObject = qobject_cast<QQuickFontLoader*>(object: component.create());
94
95 QVERIFY(fontObject != nullptr);
96 QCOMPARE(fontObject->source(), QUrl(""));
97 QCOMPARE(fontObject->name(), QString("Helvetica"));
98 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Ready);
99}
100
101void tst_qquickfontloader::localFont()
102{
103 QString componentStr = "import QtQuick 2.0\nFontLoader { source: \"" + testFileUrl(fileName: "tarzeau_ocr_a.ttf").toString() + "\" }";
104 QQmlComponent component(&engine);
105 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
106 QQuickFontLoader *fontObject = qobject_cast<QQuickFontLoader*>(object: component.create());
107
108 QVERIFY(fontObject != nullptr);
109 QVERIFY(fontObject->source() != QUrl(""));
110 QTRY_COMPARE(fontObject->name(), QString("OCRA"));
111 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Ready);
112}
113
114void tst_qquickfontloader::failLocalFont()
115{
116 QString componentStr = "import QtQuick 2.0\nFontLoader { source: \"" + testFileUrl(fileName: "dummy.ttf").toString() + "\" }";
117 QTest::ignoreMessage(type: QtWarningMsg, message: QString("<Unknown File>:2:1: QML FontLoader: Cannot load font: \"" + testFileUrl(fileName: "dummy.ttf").toString() + QLatin1Char('"')).toUtf8().constData());
118 QQmlComponent component(&engine);
119 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
120 QQuickFontLoader *fontObject = qobject_cast<QQuickFontLoader*>(object: component.create());
121
122 QVERIFY(fontObject != nullptr);
123 QVERIFY(fontObject->source() != QUrl(""));
124 QTRY_COMPARE(fontObject->name(), QString(""));
125 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Error);
126}
127
128void tst_qquickfontloader::webFont()
129{
130 QString componentStr = "import QtQuick 2.0\nFontLoader { source: \"" + server.baseUrl().toString() + "/tarzeau_ocr_a.ttf\" }";
131 QQmlComponent component(&engine);
132
133 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
134 QQuickFontLoader *fontObject = qobject_cast<QQuickFontLoader*>(object: component.create());
135
136 QVERIFY(fontObject != nullptr);
137 QVERIFY(fontObject->source() != QUrl(""));
138 QTRY_COMPARE(fontObject->name(), QString("OCRA"));
139 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Ready);
140}
141
142void tst_qquickfontloader::redirWebFont()
143{
144 server.addRedirect(filename: "olddir/oldname.ttf",redirectName: "../tarzeau_ocr_a.ttf");
145
146 QString componentStr = "import QtQuick 2.0\nFontLoader { source: \"" + server.baseUrl().toString() + "/olddir/oldname.ttf\" }";
147 QQmlComponent component(&engine);
148
149 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
150 QQuickFontLoader *fontObject = qobject_cast<QQuickFontLoader*>(object: component.create());
151
152 QVERIFY(fontObject != nullptr);
153 QVERIFY(fontObject->source() != QUrl(""));
154 QTRY_COMPARE(fontObject->name(), QString("OCRA"));
155 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Ready);
156}
157
158void tst_qquickfontloader::failWebFont()
159{
160 QString componentStr = "import QtQuick 2.0\nFontLoader { source: \"" + server.baseUrl().toString() + "/nonexist.ttf\" }";
161 const QString expectedError = "<Unknown File>:2:1: QML FontLoader: Cannot load font: \"" + server.baseUrl().toString() + "/nonexist.ttf\"";
162 QTest::ignoreMessage(type: QtWarningMsg, message: expectedError.toUtf8());
163 QQmlComponent component(&engine);
164 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
165 QQuickFontLoader *fontObject = qobject_cast<QQuickFontLoader*>(object: component.create());
166
167 QVERIFY(fontObject != nullptr);
168 QVERIFY(fontObject->source() != QUrl(""));
169 QTRY_COMPARE(fontObject->name(), QString(""));
170 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Error);
171}
172
173void tst_qquickfontloader::changeFont()
174{
175 QString componentStr = "import QtQuick 2.0\nFontLoader { source: font }";
176 QQmlContext *ctxt = engine.rootContext();
177 ctxt->setContextProperty("font", testFileUrl(fileName: "tarzeau_ocr_a.ttf"));
178 QQmlComponent component(&engine);
179 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
180 QQuickFontLoader *fontObject = qobject_cast<QQuickFontLoader*>(object: component.create());
181
182 QVERIFY(fontObject != nullptr);
183
184 QSignalSpy nameSpy(fontObject, SIGNAL(nameChanged()));
185 QSignalSpy statusSpy(fontObject, SIGNAL(statusChanged()));
186
187 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Ready);
188 QCOMPARE(nameSpy.count(), 0);
189 QCOMPARE(statusSpy.count(), 0);
190 QTRY_COMPARE(fontObject->name(), QString("OCRA"));
191
192 ctxt->setContextProperty("font", server.urlString(documentPath: "/daniel.ttf"));
193 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Loading);
194 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Ready);
195 QCOMPARE(nameSpy.count(), 1);
196 QCOMPARE(statusSpy.count(), 2);
197 QTRY_COMPARE(fontObject->name(), QString("Daniel"));
198
199 ctxt->setContextProperty("font", testFileUrl(fileName: "tarzeau_ocr_a.ttf"));
200 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Ready);
201 QCOMPARE(nameSpy.count(), 2);
202 QCOMPARE(statusSpy.count(), 2);
203 QTRY_COMPARE(fontObject->name(), QString("OCRA"));
204
205 ctxt->setContextProperty("font", server.urlString(documentPath: "/daniel.ttf"));
206 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Ready);
207 QCOMPARE(nameSpy.count(), 3);
208 QCOMPARE(statusSpy.count(), 2);
209 QTRY_COMPARE(fontObject->name(), QString("Daniel"));
210}
211
212void tst_qquickfontloader::changeFontSourceViaState()
213{
214 QQuickView window(testFileUrl(fileName: "qtbug-20268.qml"));
215 window.show();
216 window.requestActivate();
217 QVERIFY(QTest::qWaitForWindowActive(&window));
218 QCOMPARE(&window, qGuiApp->focusWindow());
219
220 QQuickFontLoader *fontObject = qobject_cast<QQuickFontLoader*>(object: qvariant_cast<QObject *>(v: window.rootObject()->property(name: "fontloader")));
221 QVERIFY(fontObject != nullptr);
222 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Ready);
223 QVERIFY(fontObject->source() != QUrl(""));
224 QTRY_COMPARE(fontObject->name(), QString("OCRA"));
225
226 window.rootObject()->setProperty(name: "usename", value: true);
227
228 // This warning should probably not be printed once QTBUG-20268 is fixed
229 QString warning = QString(testFileUrl(fileName: "qtbug-20268.qml").toString()) +
230 QLatin1String(":13:5: QML FontLoader: Cannot load font: \"\"");
231 QTest::ignoreMessage(type: QtWarningMsg, qPrintable(warning));
232
233 QEXPECT_FAIL("", "QTBUG-20268", Abort);
234 QTRY_COMPARE(fontObject->status(), QQuickFontLoader::Ready);
235 QCOMPARE(window.rootObject()->property("name").toString(), QString("Tahoma"));
236}
237
238QTEST_MAIN(tst_qquickfontloader)
239
240#include "tst_qquickfontloader.moc"
241

source code of qtdeclarative/tests/auto/quick/qquickfontloader/tst_qquickfontloader.cpp