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 <QtTest/QtTest>
29#include <QtCore/QCoreApplication>
30#include <QtCore/QScopedPointer>
31#include <QtCore/QSettings>
32#include <QtCore/QVariant>
33#include <QtGui/QColor>
34#include <QtGui/QFont>
35#include <QtQml/QQmlEngine>
36#include <QtQml/QQmlComponent>
37#include "../../shared/util.h"
38
39class tst_QQmlSettings : public QQmlDataTest
40{
41 Q_OBJECT
42
43private slots:
44 void initTestCase();
45
46 void init();
47 void cleanup();
48
49 void basic();
50 void types();
51 void aliases_data();
52 void aliases();
53 void categories();
54 void siblings();
55 void initial();
56 void noApplicationIdentifiersSet();
57};
58
59// ### Replace keyValueMap("foo", "bar") with QVariantMap({{"foo", "bar"}})
60// when C++11 uniform initialization can be used (not supported by MSVC 2013).
61static QVariantMap keyValueMap(const QString &key, const QString &value)
62{
63 QVariantMap var;
64 var.insert(akey: key, avalue: value);
65 return var;
66}
67
68class CppObject : public QObject
69{
70 Q_OBJECT
71 Q_PROPERTY(int intProperty MEMBER m_intProperty NOTIFY intPropertyChanged)
72 Q_PROPERTY(bool boolProperty MEMBER m_boolProperty NOTIFY boolPropertyChanged)
73 Q_PROPERTY(qreal realProperty MEMBER m_realProperty NOTIFY realPropertyChanged)
74 Q_PROPERTY(double doubleProperty MEMBER m_doubleProperty NOTIFY doublePropertyChanged)
75 Q_PROPERTY(QString stringProperty MEMBER m_stringProperty NOTIFY stringPropertyChanged)
76 Q_PROPERTY(QUrl urlProperty MEMBER m_urlProperty NOTIFY urlPropertyChanged)
77 Q_PROPERTY(QVariant varProperty MEMBER m_varProperty NOTIFY varPropertyChanged)
78 Q_PROPERTY(QVariantMap objectProperty MEMBER m_objectProperty NOTIFY objectPropertyChanged)
79 Q_PROPERTY(QVariantList intListProperty MEMBER m_intListProperty NOTIFY intListPropertyChanged)
80 Q_PROPERTY(QVariantList stringListProperty MEMBER m_stringListProperty NOTIFY stringListPropertyChanged)
81 Q_PROPERTY(QVariantList objectListProperty MEMBER m_objectListProperty NOTIFY objectListPropertyChanged)
82 Q_PROPERTY(QDate dateProperty MEMBER m_dateProperty NOTIFY datePropertyChanged)
83 // QTBUG-32295: Q_PROPERTY(QTime timeProperty MEMBER m_timeProperty NOTIFY timePropertyChanged)
84 Q_PROPERTY(QSizeF sizeProperty MEMBER m_sizeProperty NOTIFY sizePropertyChanged)
85 Q_PROPERTY(QPointF pointProperty MEMBER m_pointProperty NOTIFY pointPropertyChanged)
86 Q_PROPERTY(QRectF rectProperty MEMBER m_rectProperty NOTIFY rectPropertyChanged)
87 Q_PROPERTY(QColor colorProperty MEMBER m_colorProperty NOTIFY colorPropertyChanged)
88 Q_PROPERTY(QFont fontProperty MEMBER m_fontProperty NOTIFY fontPropertyChanged)
89
90public:
91 CppObject(QObject *parent = nullptr) : QObject(parent),
92
93 m_stringProperty("foo"),
94 m_urlProperty("http://www.qt-project.org"),
95 m_objectProperty(keyValueMap(key: "foo", value: "bar")),
96 m_intListProperty(QVariantList() << 1 << 2 << 3),
97 m_stringListProperty(QVariantList() << "a" << "b" << "c"),
98 m_objectListProperty(QVariantList() << keyValueMap(key: "a", value: "b") << keyValueMap(key: "c", value: "d")),
99 m_dateProperty(2000, 1, 2),
100 // QTBUG-32295: m_timeProperty(12, 34, 56),
101 m_sizeProperty(12, 34),
102 m_pointProperty(12, 34),
103 m_rectProperty(1, 2, 3, 4),
104 m_colorProperty("red")
105 {
106 }
107
108signals:
109 void intPropertyChanged(int arg);
110 void boolPropertyChanged(bool arg);
111 void realPropertyChanged(qreal arg);
112 void doublePropertyChanged(double arg);
113 void stringPropertyChanged(const QString &arg);
114 void urlPropertyChanged(const QUrl &arg);
115 void varPropertyChanged(const QVariant &arg);
116 void objectPropertyChanged(const QVariantMap &arg);
117 void intListPropertyChanged(const QVariantList &arg);
118 void stringListPropertyChanged(const QVariantList &arg);
119 void objectListPropertyChanged(const QVariantList &arg);
120 void datePropertyChanged(const QDate &arg);
121 void sizePropertyChanged(const QSizeF &arg);
122 void pointPropertyChanged(const QPointF &arg);
123 void rectPropertyChanged(const QRectF &arg);
124 void colorPropertyChanged(const QColor &arg);
125 void fontPropertyChanged(const QFont &arg);
126
127private:
128 int m_intProperty = 123;
129 bool m_boolProperty = true;
130 qreal m_realProperty = 1.23;
131 double m_doubleProperty = 3.45;
132 QString m_stringProperty;
133 QUrl m_urlProperty;
134 QVariant m_varProperty;
135 QVariantMap m_objectProperty;
136 QVariantList m_intListProperty;
137 QVariantList m_stringListProperty;
138 QVariantList m_objectListProperty;
139 QDate m_dateProperty;
140 QSizeF m_sizeProperty;
141 QPointF m_pointProperty;
142 QRectF m_rectProperty;
143 QColor m_colorProperty;
144 QFont m_fontProperty;
145};
146
147void tst_QQmlSettings::initTestCase()
148{
149 QQmlDataTest::initTestCase();
150
151 qmlRegisterType<CppObject>(uri: "Qt.test", versionMajor: 1, versionMinor: 0, qmlName: "CppObject");
152}
153
154void tst_QQmlSettings::init()
155{
156 QSettings settings;
157 settings.clear();
158
159 QCoreApplication::setApplicationName("tst_QQmlSettings");
160 QCoreApplication::setOrganizationName("QtProject");
161 QCoreApplication::setOrganizationDomain("qt-project.org");
162}
163
164void tst_QQmlSettings::cleanup()
165{
166 QSettings settings;
167 settings.clear();
168}
169
170void tst_QQmlSettings::basic()
171{
172 QQmlEngine engine;
173 QQmlComponent component(&engine, testFileUrl(fileName: "basic.qml"));
174 QScopedPointer<QObject> root(component.create());
175 QVERIFY(root.data());
176 QVERIFY(root->property("success").toBool());
177 QSettings settings;
178 QTRY_VERIFY(settings.value("success").toBool());
179}
180
181void tst_QQmlSettings::types()
182{
183 QQmlEngine engine;
184 QQmlComponent component(&engine, testFileUrl(fileName: "types.qml"));
185 QScopedPointer<QObject> root(component.create());
186 QVERIFY(root.data());
187 QObject *settings = root->property(name: "settings").value<QObject *>();
188 QVERIFY(settings);
189
190 // default property values
191 QCOMPARE(root->property("intProperty").toInt(), 0);
192 QCOMPARE(root->property("boolProperty").toBool(), false);
193 QCOMPARE(root->property("realProperty").toReal(), static_cast<qreal>(0.0));
194 QCOMPARE(root->property("doubleProperty").toDouble(), static_cast<double>(0.0));
195 QCOMPARE(root->property("stringProperty").toString(), QString());
196 QCOMPARE(root->property("urlProperty").toUrl(), QUrl());
197 QCOMPARE(root->property("objectProperty").toMap(), QVariantMap());
198 QCOMPARE(root->property("intListProperty").toList(), QVariantList());
199 QCOMPARE(root->property("stringListProperty").toList(), QVariantList());
200 QCOMPARE(root->property("objectListProperty").toList(), QVariantList());
201 QCOMPARE(root->property("dateProperty").toDate(), QDate());
202 // QTBUG-32295: QCOMPARE(root->property("timeProperty").toDate(), QTime());
203 QCOMPARE(root->property("sizeProperty").toSizeF(), QSizeF());
204 QCOMPARE(root->property("pointProperty").toPointF(), QPointF());
205 QCOMPARE(root->property("rectProperty").toRectF(), QRectF());
206 QCOMPARE(root->property("colorProperty").value<QColor>(), QColor());
207 QCOMPARE(root->property("fontProperty").value<QFont>(), QFont());
208
209 // default settings values
210 QCOMPARE(settings->property("intProperty").toInt(), 123);
211 QCOMPARE(settings->property("boolProperty").toBool(), true);
212 QCOMPARE(settings->property("realProperty").toReal(), static_cast<qreal>(1.23));
213 QCOMPARE(settings->property("doubleProperty").toDouble(), static_cast<double>(3.45));
214 QCOMPARE(settings->property("stringProperty").toString(), QStringLiteral("foo"));
215 QCOMPARE(settings->property("urlProperty").toUrl(), QUrl("http://www.qt-project.org"));
216 QCOMPARE(settings->property("objectProperty").toMap(), keyValueMap("foo","bar"));
217 QCOMPARE(settings->property("intListProperty").toList(), QVariantList() << 1 << 2 << 3);
218 QCOMPARE(settings->property("stringListProperty").toList(), QVariantList() << QStringLiteral("a") << QStringLiteral("b") << QStringLiteral("c"));
219 QCOMPARE(settings->property("objectListProperty").toList(), QVariantList() << keyValueMap("a", "b") << keyValueMap("c","d"));
220 QCOMPARE(settings->property("dateProperty").toDate(), QDate(2000, 01, 02));
221 // QTBUG-32295: QCOMPARE(settings->property("timeProperty").toDate(), QTime(12, 34, 56));
222 QCOMPARE(settings->property("sizeProperty").toSizeF(), QSizeF(12, 34));
223 QCOMPARE(settings->property("pointProperty").toPointF(), QPointF(12, 34));
224 QCOMPARE(settings->property("rectProperty").toRectF(), QRectF(1, 2, 3, 4));
225 QCOMPARE(settings->property("colorProperty").value<QColor>(), QColor(Qt::red));
226 QCOMPARE(settings->property("fontProperty").value<QFont>(), QFont());
227
228 // read settings
229 QVERIFY(QMetaObject::invokeMethod(root.data(), "readSettings"));
230 QCOMPARE(root->property("intProperty").toInt(), 123);
231 QCOMPARE(root->property("boolProperty").toBool(), true);
232 QCOMPARE(root->property("realProperty").toReal(), static_cast<qreal>(1.23));
233 QCOMPARE(root->property("doubleProperty").toDouble(), static_cast<double>(3.45));
234 QCOMPARE(root->property("stringProperty").toString(), QStringLiteral("foo"));
235 QCOMPARE(root->property("urlProperty").toUrl(), QUrl("http://www.qt-project.org"));
236 QCOMPARE(root->property("objectProperty").toMap(), keyValueMap("foo","bar"));
237 QCOMPARE(root->property("intListProperty").toList(), QVariantList() << 1 << 2 << 3);
238 QCOMPARE(root->property("stringListProperty").toList(), QVariantList() << QStringLiteral("a") << QStringLiteral("b") << QStringLiteral("c"));
239 QCOMPARE(root->property("dateProperty").toDate(), QDate(2000, 01, 02));
240 QCOMPARE(root->property("objectListProperty").toList(), QVariantList() << keyValueMap("a", "b") << keyValueMap("c","d"));
241 // QTBUG-32295: QCOMPARE(root->property("timeProperty").toDate(), QTime(12, 34, 56));
242 QCOMPARE(root->property("sizeProperty").toSizeF(), QSizeF(12, 34));
243 QCOMPARE(root->property("pointProperty").toPointF(), QPointF(12, 34));
244 QCOMPARE(root->property("rectProperty").toRectF(), QRectF(1, 2, 3, 4));
245 QCOMPARE(root->property("colorProperty").value<QColor>(), QColor(Qt::red));
246 QCOMPARE(root->property("fontProperty").value<QFont>(), QFont());
247
248 // change properties
249 QVERIFY(root->setProperty("intProperty", 456));
250 QVERIFY(root->setProperty("boolProperty", false));
251 QVERIFY(root->setProperty("realProperty", static_cast<qreal>(4.56)));
252 QVERIFY(root->setProperty("doubleProperty", static_cast<double>(6.78)));
253 QVERIFY(root->setProperty("stringProperty", QStringLiteral("bar")));
254 QVERIFY(root->setProperty("urlProperty", QUrl("https://codereview.qt-project.org")));
255 QVERIFY(root->setProperty("objectProperty", keyValueMap("bar", "baz")));
256 QVERIFY(root->setProperty("intListProperty", QVariantList() << 4 << 5 << 6));
257 QVERIFY(root->setProperty("stringListProperty", QVariantList() << QStringLiteral("d") << QStringLiteral("e") << QStringLiteral("f")));
258 QVERIFY(root->setProperty("objectListProperty", QVariantList() << keyValueMap("e", "f") << keyValueMap("g", "h")));
259 QVERIFY(root->setProperty("dateProperty", QDate(2010, 02, 01)));
260 // QTBUG-32295: QVERIFY(root->setProperty("timeProperty", QTime(6, 56, 34)));
261 QVERIFY(root->setProperty("sizeProperty", QSizeF(56, 78)));
262 QVERIFY(root->setProperty("pointProperty", QPointF(56, 78)));
263 QVERIFY(root->setProperty("rectProperty", QRectF(5, 6, 7, 8)));
264 QVERIFY(root->setProperty("colorProperty", QColor(Qt::blue)));
265 QFont boldFont; boldFont.setBold(true);
266 QVERIFY(root->setProperty("fontProperty", boldFont));
267
268 // write settings
269 QVERIFY(QMetaObject::invokeMethod(root.data(), "writeSettings"));
270 QTRY_COMPARE(settings->property("intProperty").toInt(), 456);
271 QTRY_COMPARE(settings->property("boolProperty").toBool(), false);
272 QTRY_COMPARE(settings->property("realProperty").toReal(), static_cast<qreal>(4.56));
273 QTRY_COMPARE(settings->property("doubleProperty").toDouble(), static_cast<double>(6.78));
274 QTRY_COMPARE(settings->property("stringProperty").toString(), QStringLiteral("bar"));
275 QTRY_COMPARE(settings->property("urlProperty").toUrl(), QUrl("https://codereview.qt-project.org"));
276 QTRY_COMPARE(settings->property("objectProperty").toMap(), keyValueMap("bar", "baz"));
277 QTRY_COMPARE(settings->property("intListProperty").toList(), QVariantList() << 4 << 5 << 6);
278 QTRY_COMPARE(settings->property("stringListProperty").toList(), QVariantList() << QStringLiteral("d") << QStringLiteral("e") << QStringLiteral("f"));
279 QTRY_COMPARE(settings->property("objectListProperty").toList(), QVariantList() << keyValueMap("e", "f") << keyValueMap("g", "h"));
280 QTRY_COMPARE(settings->property("dateProperty").toDate(), QDate(2010, 02, 01));
281 // QTBUG-32295: QTRY_COMPARE(settings->property("timeProperty").toDate(), QTime(6, 56, 34));
282 QTRY_COMPARE(settings->property("sizeProperty").toSizeF(), QSizeF(56, 78));
283 QTRY_COMPARE(settings->property("pointProperty").toPointF(), QPointF(56, 78));
284 QTRY_COMPARE(settings->property("rectProperty").toRectF(), QRectF(5, 6, 7, 8));
285 QTRY_COMPARE(settings->property("colorProperty").value<QColor>(), QColor(Qt::blue));
286 QTRY_COMPARE(settings->property("fontProperty").value<QFont>(), boldFont);
287
288 QSettings qs;
289 QTRY_COMPARE(qs.value("intProperty").toInt(), 456);
290 QTRY_COMPARE(qs.value("boolProperty").toBool(), false);
291 QTRY_COMPARE(qs.value("realProperty").toReal(), static_cast<qreal>(4.56));
292 QTRY_COMPARE(qs.value("doubleProperty").toDouble(), static_cast<double>(6.78));
293 QTRY_COMPARE(qs.value("stringProperty").toString(), QStringLiteral("bar"));
294 QTRY_COMPARE(qs.value("urlProperty").toUrl(), QUrl("https://codereview.qt-project.org"));
295 QTRY_COMPARE(qs.value("objectProperty").toMap(), keyValueMap("bar", "baz"));
296 QTRY_COMPARE(qs.value("intListProperty").toList(), QVariantList() << 4 << 5 << 6);
297 QTRY_COMPARE(qs.value("stringListProperty").toList(), QVariantList() << QStringLiteral("d") << QStringLiteral("e") << QStringLiteral("f"));
298 QTRY_COMPARE(qs.value("objectListProperty").toList(), QVariantList() << keyValueMap("e", "f") << keyValueMap("g", "h"));
299 QTRY_COMPARE(qs.value("dateProperty").toDate(), QDate(2010, 02, 01));
300 // QTBUG-32295: QTRY_COMPARE(qs.value("timeProperty").toDate(), QTime(6, 56, 34));
301 QTRY_COMPARE(qs.value("sizeProperty").toSizeF(), QSizeF(56, 78));
302 QTRY_COMPARE(qs.value("pointProperty").toPointF(), QPointF(56, 78));
303 QTRY_COMPARE(qs.value("rectProperty").toRectF(), QRectF(5, 6, 7, 8));
304 QTRY_COMPARE(qs.value("colorProperty").value<QColor>(), QColor(Qt::blue));
305 QTRY_COMPARE(qs.value("fontProperty").value<QFont>(), boldFont);
306}
307
308void tst_QQmlSettings::aliases_data()
309{
310 QTest::addColumn<QString>(name: "testFile");
311 QTest::newRow(dataTag: "qml") << "aliases.qml";
312 QTest::newRow(dataTag: "cpp") << "cpp-aliases.qml";
313}
314
315void tst_QQmlSettings::aliases()
316{
317 QFETCH(QString, testFile);
318
319 QQmlEngine engine;
320 QQmlComponent component(&engine, testFileUrl(fileName: testFile));
321 QScopedPointer<QObject> root(component.create());
322 QVERIFY(root.data());
323 QObject *settings = root->property(name: "settings").value<QObject *>();
324 QVERIFY(settings);
325
326 // default property values
327 QCOMPARE(root->property("intProperty").toInt(), 123);
328 QCOMPARE(root->property("boolProperty").toBool(), true);
329 QCOMPARE(root->property("realProperty").toReal(), static_cast<qreal>(1.23));
330 QCOMPARE(root->property("doubleProperty").toDouble(), static_cast<double>(3.45));
331 QCOMPARE(root->property("stringProperty").toString(), QStringLiteral("foo"));
332 QCOMPARE(root->property("urlProperty").toUrl(), QUrl("http://www.qt-project.org"));
333 QCOMPARE(root->property("objectProperty").toMap(), keyValueMap("foo","bar"));
334 QCOMPARE(root->property("intListProperty").toList(), QVariantList() << 1 << 2 << 3);
335 QCOMPARE(root->property("stringListProperty").toList(), QVariantList() << QStringLiteral("a") << QStringLiteral("b") << QStringLiteral("c"));
336 QCOMPARE(root->property("objectListProperty").toList(), QVariantList() << keyValueMap("a", "b") << keyValueMap("c","d"));
337 QCOMPARE(root->property("dateProperty").toDate(), QDate(2000, 01, 02));
338 // QTBUG-32295: QCOMPARE(root->property("timeProperty").toDate(), QTime(12, 34, 56));
339 QCOMPARE(root->property("sizeProperty").toSizeF(), QSizeF(12, 34));
340 QCOMPARE(root->property("pointProperty").toPointF(), QPointF(12, 34));
341 QCOMPARE(root->property("rectProperty").toRectF(), QRectF(1, 2, 3, 4));
342 QCOMPARE(root->property("colorProperty").value<QColor>(), QColor(Qt::red));
343 QCOMPARE(root->property("fontProperty").value<QFont>(), QFont());
344
345 // default settings values
346 QCOMPARE(settings->property("intProperty").toInt(), 123);
347 QCOMPARE(settings->property("boolProperty").toBool(), true);
348 QCOMPARE(settings->property("realProperty").toReal(), static_cast<qreal>(1.23));
349 QCOMPARE(settings->property("doubleProperty").toDouble(), static_cast<double>(3.45));
350 QCOMPARE(settings->property("stringProperty").toString(), QStringLiteral("foo"));
351 QCOMPARE(settings->property("urlProperty").toUrl(), QUrl("http://www.qt-project.org"));
352 QCOMPARE(settings->property("objectProperty").toMap(), keyValueMap("foo","bar"));
353 QCOMPARE(settings->property("intListProperty").toList(), QVariantList() << 1 << 2 << 3);
354 QCOMPARE(settings->property("stringListProperty").toList(), QVariantList() << QStringLiteral("a") << QStringLiteral("b") << QStringLiteral("c"));
355 QCOMPARE(settings->property("objectListProperty").toList(), QVariantList() << keyValueMap("a", "b") << keyValueMap("c","d"));
356 QCOMPARE(settings->property("dateProperty").toDate(), QDate(2000, 01, 02));
357 // QTBUG-32295: QCOMPARE(settings->property("timeProperty").toDate(), QTime(12, 34, 56));
358 QCOMPARE(settings->property("sizeProperty").toSizeF(), QSizeF(12, 34));
359 QCOMPARE(settings->property("pointProperty").toPointF(), QPointF(12, 34));
360 QCOMPARE(settings->property("rectProperty").toRectF(), QRectF(1, 2, 3, 4));
361 QCOMPARE(settings->property("colorProperty").value<QColor>(), QColor(Qt::red));
362 QCOMPARE(settings->property("fontProperty").value<QFont>(), QFont());
363
364 // change settings
365 QVERIFY(settings->setProperty("intProperty", 456));
366 QVERIFY(settings->setProperty("boolProperty", false));
367 QVERIFY(settings->setProperty("realProperty", static_cast<qreal>(4.56)));
368 QVERIFY(settings->setProperty("doubleProperty", static_cast<double>(6.78)));
369 QVERIFY(settings->setProperty("stringProperty", QStringLiteral("bar")));
370 QVERIFY(settings->setProperty("urlProperty", QUrl("https://codereview.qt-project.org")));
371 QVERIFY(settings->setProperty("objectProperty", keyValueMap("bar", "baz")));
372 QVERIFY(settings->setProperty("intListProperty", QVariantList() << 4 << 5 << 6));
373 QVERIFY(settings->setProperty("stringListProperty", QVariantList() << QStringLiteral("d") << QStringLiteral("e") << QStringLiteral("f")));
374 QVERIFY(settings->setProperty("objectListProperty", QVariantList() << keyValueMap("e", "f") << keyValueMap("g", "h")));
375 QVERIFY(settings->setProperty("dateProperty", QDate(2010, 02, 01)));
376 // QTBUG-32295: QVERIFY(settings->setProperty("timeProperty", QTime(6, 56, 34)));
377 QVERIFY(settings->setProperty("sizeProperty", QSizeF(56, 78)));
378 QVERIFY(settings->setProperty("pointProperty", QPointF(56, 78)));
379 QVERIFY(settings->setProperty("rectProperty", QRectF(5, 6, 7, 8)));
380 QVERIFY(settings->setProperty("colorProperty", QColor(Qt::blue)));
381 QFont boldFont; boldFont.setBold(true);
382 QVERIFY(settings->setProperty("fontProperty", boldFont));
383
384 QSettings qs;
385 QTRY_COMPARE(qs.value("intProperty").toInt(), 456);
386 QTRY_COMPARE(qs.value("boolProperty").toBool(), false);
387 QTRY_COMPARE(qs.value("realProperty").toReal(), static_cast<qreal>(4.56));
388 QTRY_COMPARE(qs.value("doubleProperty").toDouble(), static_cast<double>(6.78));
389 QTRY_COMPARE(qs.value("stringProperty").toString(), QStringLiteral("bar"));
390 QTRY_COMPARE(qs.value("urlProperty").toUrl(), QUrl("https://codereview.qt-project.org"));
391 QTRY_COMPARE(qs.value("objectProperty").toMap(), keyValueMap("bar", "baz"));
392 QTRY_COMPARE(qs.value("intListProperty").toList(), QVariantList() << 4 << 5 << 6);
393 QTRY_COMPARE(qs.value("stringListProperty").toList(), QVariantList() << QStringLiteral("d") << QStringLiteral("e") << QStringLiteral("f"));
394 QTRY_COMPARE(qs.value("objectListProperty").toList(), QVariantList() << keyValueMap("e", "f") << keyValueMap("g", "h"));
395 QTRY_COMPARE(qs.value("dateProperty").toDate(), QDate(2010, 02, 01));
396 // QTBUG-32295: QTRY_COMPARE(qs.value("timeProperty").toDate(), QTime(6, 56, 34));
397 QTRY_COMPARE(qs.value("sizeProperty").toSizeF(), QSizeF(56, 78));
398 QTRY_COMPARE(qs.value("pointProperty").toPointF(), QPointF(56, 78));
399 QTRY_COMPARE(qs.value("rectProperty").toRectF(), QRectF(5, 6, 7, 8));
400 QTRY_COMPARE(qs.value("colorProperty").value<QColor>(), QColor(Qt::blue));
401 QTRY_COMPARE(qs.value("fontProperty").value<QFont>(), boldFont);
402}
403
404void tst_QQmlSettings::categories()
405{
406 QQmlEngine engine;
407 QQmlComponent component(&engine, testFileUrl(fileName: "categories.qml"));
408
409 {
410 // initial state
411 QSettings qs;
412 QVERIFY(!qs.childGroups().contains("initialCategory"));
413 QVERIFY(!qs.childGroups().contains("changedCategory"));
414 QVERIFY(!qs.childKeys().contains("value"));
415 }
416
417 {
418 // load & write default values
419 QScopedPointer<QObject> settings(component.create());
420 QVERIFY(settings.data());
421 QCOMPARE(settings->property("category").toString(), QStringLiteral("initialCategory"));
422 QCOMPARE(settings->property("value").toString(), QStringLiteral("initialValue"));
423 }
424
425 {
426 // verify written settings & change the value
427 QSettings qs;
428 QVERIFY(qs.childGroups().contains("initialCategory"));
429 qs.beginGroup(prefix: "initialCategory");
430 QVERIFY(qs.childKeys().contains("value"));
431 QCOMPARE(qs.value("value").toString(), QStringLiteral("initialValue"));
432 qs.setValue(key: "value", QStringLiteral("changedValue"));
433 }
434
435 {
436 // load changed value & change the category
437 QScopedPointer<QObject> settings(component.create());
438 QVERIFY(settings.data());
439 QCOMPARE(settings->property("category").toString(), QStringLiteral("initialCategory"));
440 QCOMPARE(settings->property("value").toString(), QStringLiteral("changedValue"));
441 QVERIFY(settings->setProperty("category", QStringLiteral("changedCategory")));
442 }
443
444 {
445 // verify written settings
446 QSettings qs;
447 QVERIFY(qs.childGroups().contains("changedCategory"));
448 qs.beginGroup(prefix: "changedCategory");
449 QVERIFY(qs.childKeys().contains("value"));
450 QCOMPARE(qs.value("value").toString(), QStringLiteral("changedValue"));
451 qs.setValue(key: "value", QStringLiteral("changedValue"));
452 qs.endGroup();
453 }
454}
455
456void tst_QQmlSettings::siblings()
457{
458 QQmlEngine engine;
459 QQmlComponent component(&engine, testFileUrl(fileName: "siblings.qml"));
460 delete component.create();
461
462 // verify setting aliases to destructed siblings
463 QSettings settings;
464 QCOMPARE(settings.value("alias1").toString(), QStringLiteral("value1"));
465 QCOMPARE(settings.value("alias2").toString(), QStringLiteral("value2"));
466}
467
468void tst_QQmlSettings::initial()
469{
470 QSettings qs;
471 qs.setValue(key: "value", QStringLiteral("initial"));
472 qs.sync();
473
474 QQmlEngine engine;
475 QQmlComponent component(&engine);
476 component.setData("import Qt.labs.settings 1.0; Settings { property var value }", baseUrl: QUrl());
477 QScopedPointer<QObject> settings(component.create());
478 QVERIFY(settings.data());
479
480 // verify that the initial value from QSettings gets properly loaded
481 // even if no initial value is set in QML
482 QCOMPARE(settings->property("value").toString(), QStringLiteral("initial"));
483}
484
485void tst_QQmlSettings::noApplicationIdentifiersSet()
486{
487#ifdef Q_OS_MACOS
488 QSKIP("macOS doesn't complain about empty application identifiers");
489#endif
490
491 QCoreApplication::setApplicationName(QString());
492 QCoreApplication::setOrganizationName(QString());
493 QCoreApplication::setOrganizationDomain(QString());
494
495 QTest::ignoreMessage(type: QtWarningMsg, messagePattern: QRegularExpression(".*QML Settings: Failed to initialize QSettings instance. Status code is: 1"));
496 // Can't set an empty applicationName because QCoreApplication won't allow it, which is why it's not listed here.
497 QTest::ignoreMessage(type: QtWarningMsg, messagePattern: QRegularExpression(".*QML Settings: The following application identifiers have not been set: QVector\\(\"organizationName\", \"organizationDomain\"\\)"));
498
499 QQmlEngine engine;
500 QQmlComponent component(&engine, testFileUrl(fileName: "basic.qml"));
501 QScopedPointer<QObject> root(component.create());
502 QVERIFY(root.data());
503 // The value of the QML property will be true because it defaults to it...
504 QVERIFY(root->property("success").toBool());
505 QSettings settings;
506 // ... but the settings' value should be false because it was never loaded.
507 QVERIFY(!settings.value("success").toBool());
508}
509
510QTEST_MAIN(tst_QQmlSettings)
511
512#include "tst_qqmlsettings.moc"
513

source code of qtdeclarative/tests/auto/qml/qqmlsettings/tst_qqmlsettings.cpp