f9f395c28b
Updated version of LGPL and FDL licenseheaders. Apply release phase licenseheaders for all source files. Reviewed-by: Trust Me
3180 lines
118 KiB
C++
3180 lines
118 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
** All rights reserved.
|
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
|
**
|
|
** 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$
|
|
**
|
|
****************************************************************************/
|
|
|
|
|
|
#include <qdebug.h>
|
|
#include <QtTest/QtTest>
|
|
|
|
#include <QtCore/QSettings>
|
|
#include <private/qsettings_p.h>
|
|
//#include <QtGui/QApplication>
|
|
#include <QtCore/QCoreApplication>
|
|
#include <QtCore/QtGlobal>
|
|
#include <QtCore/QMetaType>
|
|
#include <QtCore/QtDebug>
|
|
#include <QtCore/QString>
|
|
#include "../../shared/util.h"
|
|
|
|
#if !defined(Q_OS_SYMBIAN)
|
|
# include <cctype>
|
|
#endif
|
|
#if defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
|
// need for unlink on mingw
|
|
#include <io.h>
|
|
#endif
|
|
|
|
#if defined(Q_OS_WIN)
|
|
#include <QtCore/qt_windows.h>
|
|
#endif
|
|
|
|
#ifndef QSETTINGS_P_H_VERSION
|
|
#define QSETTINGS_P_H_VERSION 1
|
|
#endif
|
|
|
|
//TESTED_FILES=
|
|
|
|
QT_FORWARD_DECLARE_CLASS(QSettings)
|
|
QT_FORWARD_DECLARE_CLASS(QSettings)
|
|
|
|
class tst_QSettings : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
tst_QSettings();
|
|
|
|
public slots:
|
|
void init();
|
|
void cleanup();
|
|
private slots:
|
|
void getSetCheck();
|
|
void ctor_data();
|
|
void ctor();
|
|
void beginGroup();
|
|
void setValue();
|
|
void remove();
|
|
void contains();
|
|
void sync();
|
|
void setFallbacksEnabled();
|
|
void setFallbacksEnabled_data();
|
|
void fromFile_data();
|
|
void fromFile();
|
|
void setIniCodec();
|
|
void testArrays_data();
|
|
void testArrays();
|
|
void testEscapes();
|
|
void testCaseSensitivity_data();
|
|
void testCaseSensitivity();
|
|
void testErrorHandling_data();
|
|
void testErrorHandling();
|
|
void testIniParsing_data();
|
|
void testIniParsing();
|
|
void testChildKeysAndGroups_data();
|
|
void testChildKeysAndGroups();
|
|
void testUpdateRequestEvent();
|
|
void testThreadSafety();
|
|
void testNormalizedKey_data();
|
|
void testNormalizedKey();
|
|
void testEmptyData();
|
|
void testResourceFiles();
|
|
void fileName();
|
|
void isWritable_data();
|
|
void isWritable();
|
|
void childGroups_data();
|
|
void childGroups();
|
|
void childKeys_data();
|
|
void childKeys();
|
|
void allKeys_data();
|
|
void allKeys();
|
|
void registerFormat();
|
|
void setPath();
|
|
void setDefaultFormat();
|
|
void dontCreateNeedlessPaths();
|
|
#if !defined(Q_OS_WIN) && !defined(Q_OS_SYMBIAN)
|
|
void dontReorderIniKeysNeedlessly();
|
|
#endif
|
|
#if defined(Q_OS_WIN)
|
|
void qtbug_13249();
|
|
#endif
|
|
|
|
void testVariantTypes_data();
|
|
void testVariantTypes();
|
|
void rainersSyncBugOnMac_data();
|
|
void rainersSyncBugOnMac();
|
|
void recursionBug();
|
|
|
|
void testByteArray_data();
|
|
void testByteArray();
|
|
|
|
private:
|
|
void oldWriteEntry_data();
|
|
void oldReadEntry_data();
|
|
void oldWriteEntryHelper(QSettings &settings);
|
|
void oldReadEntryHelper(QSettings &settings);
|
|
};
|
|
|
|
// Testing get/set functions
|
|
void tst_QSettings::getSetCheck()
|
|
{
|
|
QSettings obj1;
|
|
// bool QSettings::fallbacksEnabled()
|
|
// void QSettings::setFallbacksEnabled(bool)
|
|
obj1.setFallbacksEnabled(false);
|
|
QCOMPARE(false, obj1.fallbacksEnabled());
|
|
obj1.setFallbacksEnabled(true);
|
|
QCOMPARE(true, obj1.fallbacksEnabled());
|
|
}
|
|
|
|
//using namespace std;
|
|
|
|
//#include <qapplication.h>
|
|
#include <qcoreapplication.h>
|
|
#include <qdir.h>
|
|
#include <qregexp.h>
|
|
#include <qthread.h>
|
|
#include <stdlib.h>
|
|
#ifndef Q_OS_WIN
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
Q_DECLARE_METATYPE(QSettings::Format)
|
|
|
|
#if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN)
|
|
static void removePath(const QString& _path)
|
|
{
|
|
QString path = _path;
|
|
QDir dir(path);
|
|
if (!dir.exists())
|
|
return;
|
|
QStringList entries = dir.entryList();
|
|
foreach(QString name, entries) {
|
|
QString absolute = path + name;
|
|
if (QFileInfo(absolute).isDir())
|
|
removePath(absolute+"\\");
|
|
else
|
|
QFile::remove(absolute);
|
|
}
|
|
dir.cdUp();
|
|
if (path[path.size()-1] == '\\')
|
|
path = path.left(path.size()-1);
|
|
dir.rmdir(path.mid(path.lastIndexOf('\\')+1));
|
|
}
|
|
#endif
|
|
|
|
static QString settingsPath(const char *path = "")
|
|
{
|
|
// Temporary path for files that are specified explictly in the constructor.
|
|
QString tempPath = QDir::tempPath();
|
|
if (tempPath.endsWith("/"))
|
|
tempPath.truncate(tempPath.size() - 1);
|
|
return QDir::toNativeSeparators(tempPath + "/tst_QSettings/" + QLatin1String(path));
|
|
}
|
|
|
|
static bool readCustom1File(QIODevice &device, QSettings::SettingsMap &map)
|
|
{
|
|
QDataStream in(&device);
|
|
quint32 magic;
|
|
in >> magic;
|
|
in >> map;
|
|
return (magic == 0x01010101 && in.status() == QDataStream::Ok);
|
|
}
|
|
|
|
static bool writeCustom1File(QIODevice &device, const QSettings::SettingsMap &map)
|
|
{
|
|
QDataStream out(&device);
|
|
out << quint32(0x01010101);
|
|
out << map;
|
|
return out.status() == QDataStream::Ok;
|
|
}
|
|
|
|
static bool readCustom2File(QIODevice &device, QSettings::SettingsMap &map)
|
|
{
|
|
QDataStream in(&device);
|
|
quint64 magic;
|
|
in >> magic;
|
|
in >> map;
|
|
return (magic == Q_UINT64_C(0x0202020202020202) && in.status() == QDataStream::Ok);
|
|
}
|
|
|
|
static bool writeCustom2File(QIODevice &device, const QSettings::SettingsMap &map)
|
|
{
|
|
QDataStream out(&device);
|
|
out << Q_UINT64_C(0x0202020202020202);
|
|
out << map;
|
|
return out.status() == QDataStream::Ok;
|
|
}
|
|
|
|
static bool readCustom3File(QIODevice &device, QSettings::SettingsMap &map)
|
|
{
|
|
QTextStream in(&device);
|
|
QString tag;
|
|
in >> tag;
|
|
if (tag == "OK") {
|
|
map.insert("retval", "OK");
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
static bool writeCustom3File(QIODevice &device, const QSettings::SettingsMap &map)
|
|
{
|
|
QTextStream out(&device);
|
|
if (map.value("retval") != "OK")
|
|
return false;
|
|
|
|
out << "OK";
|
|
return true;
|
|
}
|
|
|
|
static void populateWithFormats()
|
|
{
|
|
QTest::addColumn<QSettings::Format>("format");
|
|
|
|
QTest::newRow("native") << QSettings::NativeFormat;
|
|
QTest::newRow("ini") << QSettings::IniFormat;
|
|
QTest::newRow("custom1") << QSettings::CustomFormat1;
|
|
QTest::newRow("custom2") << QSettings::CustomFormat2;
|
|
}
|
|
|
|
tst_QSettings::tst_QSettings()
|
|
{
|
|
QSettings::Format custom1 = QSettings::registerFormat("custom1", readCustom1File, writeCustom1File);
|
|
QSettings::Format custom2 = QSettings::registerFormat("custom2", readCustom2File, writeCustom2File
|
|
#ifndef QT_QSETTINGS_ALWAYS_CASE_SENSITIVE_AND_FORGET_ORIGINAL_KEY_ORDER
|
|
, Qt::CaseInsensitive
|
|
#endif
|
|
);
|
|
QVERIFY(custom1 == QSettings::CustomFormat1);
|
|
QVERIFY(custom2 == QSettings::CustomFormat2);
|
|
}
|
|
|
|
void tst_QSettings::init()
|
|
{
|
|
QSettings::setSystemIniPath(settingsPath("__system__"));
|
|
QSettings::setUserIniPath(settingsPath("__user__"));
|
|
|
|
#if defined(Q_OS_WIN)
|
|
QSettings("HKEY_CURRENT_USER\\Software\\software.org", QSettings::NativeFormat).clear();
|
|
QSettings("HKEY_LOCAL_MACHINE\\Software\\software.org", QSettings::NativeFormat).clear();
|
|
QSettings("HKEY_CURRENT_USER\\Software\\other.software.org", QSettings::NativeFormat).clear();
|
|
QSettings("HKEY_LOCAL_MACHINE\\Software\\other.software.org", QSettings::NativeFormat).clear();
|
|
QSettings("HKEY_CURRENT_USER\\Software\\foo", QSettings::NativeFormat).clear();
|
|
QSettings("HKEY_CURRENT_USER\\Software\\bar", QSettings::NativeFormat).clear();
|
|
QSettings("HKEY_CURRENT_USER\\Software\\bat", QSettings::NativeFormat).clear();
|
|
QSettings("HKEY_CURRENT_USER\\Software\\baz", QSettings::NativeFormat).clear();
|
|
QSettings("HKEY_LOCAL_MACHINE\\Software\\foo", QSettings::NativeFormat).clear();
|
|
QSettings("HKEY_LOCAL_MACHINE\\Software\\bar", QSettings::NativeFormat).clear();
|
|
QSettings("HKEY_LOCAL_MACHINE\\Software\\bat", QSettings::NativeFormat).clear();
|
|
QSettings("HKEY_LOCAL_MACHINE\\Software\\baz", QSettings::NativeFormat).clear();
|
|
if (QDir(settingsPath()).exists()) {
|
|
#if defined(Q_OS_WINCE)
|
|
removePath(settingsPath());
|
|
#else
|
|
if (QSysInfo::windowsVersion() & QSysInfo::WV_NT_based)
|
|
system(QString("rmdir /Q /S %1").arg(settingsPath()).toLatin1());
|
|
else
|
|
system(QString("deltree /Y %1").arg(settingsPath()).toLatin1());
|
|
#endif
|
|
}
|
|
#elif defined(Q_OS_DARWIN)
|
|
QSettings(QSettings::UserScope, "software.org", "KillerAPP").clear();
|
|
QSettings(QSettings::SystemScope, "software.org", "KillerAPP").clear();
|
|
QSettings(QSettings::UserScope, "other.software.org", "KillerAPP").clear();
|
|
QSettings(QSettings::SystemScope, "other.software.org", "KillerAPP").clear();
|
|
QSettings(QSettings::UserScope, "software.org").clear();
|
|
QSettings(QSettings::SystemScope, "software.org").clear();
|
|
QSettings(QSettings::UserScope, "other.software.org").clear();
|
|
QSettings(QSettings::SystemScope, "other.software.org").clear();
|
|
#elif defined(Q_OS_SYMBIAN)
|
|
removePath(settingsPath());
|
|
#endif
|
|
|
|
#if !defined(Q_OS_WIN) && !defined(Q_OS_SYMBIAN)
|
|
system(QString("chmod -R u+rw %1 2> /dev/null").arg(settingsPath()).toLatin1());
|
|
system(QString("rm -fr %1 2> /dev/null").arg(settingsPath()).toLatin1());
|
|
#endif
|
|
|
|
QFile::remove("foo");
|
|
}
|
|
|
|
void tst_QSettings::cleanup()
|
|
{
|
|
init();
|
|
}
|
|
|
|
/*
|
|
Test the constructors and the assignment operator.
|
|
*/
|
|
|
|
void tst_QSettings::ctor_data()
|
|
{
|
|
populateWithFormats();
|
|
}
|
|
|
|
void tst_QSettings::ctor()
|
|
{
|
|
QFETCH(QSettings::Format, format);
|
|
|
|
{
|
|
QSettings settings1(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
QSettings settings2(format, QSettings::UserScope, "software.org");
|
|
QSettings settings3(format, QSettings::SystemScope, "software.org", "KillerAPP");
|
|
QSettings settings4(format, QSettings::SystemScope, "software.org");
|
|
|
|
QSettings settings5(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
QSettings settings6(format, QSettings::UserScope, "software.org");
|
|
QSettings settings7(format, QSettings::SystemScope, "software.org", "KillerAPP");
|
|
QSettings settings8(format, QSettings::SystemScope, "software.org");
|
|
|
|
// test QSettings::format() while we're at it
|
|
QVERIFY(settings1.format() == format);
|
|
QVERIFY(settings2.format() == format);
|
|
QVERIFY(settings3.format() == format);
|
|
QVERIFY(settings4.format() == format);
|
|
|
|
// test QSettings::scope() while we're at it
|
|
QVERIFY(settings1.scope() == QSettings::UserScope);
|
|
QVERIFY(settings2.scope() == QSettings::UserScope);
|
|
QVERIFY(settings3.scope() == QSettings::SystemScope);
|
|
QVERIFY(settings4.scope() == QSettings::SystemScope);
|
|
|
|
// test QSettings::organizationName() while we're at it
|
|
QVERIFY(settings1.organizationName() == "software.org");
|
|
QVERIFY(settings2.organizationName() == "software.org");
|
|
QVERIFY(settings3.organizationName() == "software.org");
|
|
QVERIFY(settings4.organizationName() == "software.org");
|
|
|
|
// test QSettings::applicationName() while we're at it
|
|
QCOMPARE(settings1.applicationName(), QString("KillerAPP"));
|
|
QVERIFY(settings2.applicationName().isEmpty());
|
|
QVERIFY(settings3.applicationName() == "KillerAPP");
|
|
QVERIFY(settings4.applicationName().isEmpty());
|
|
|
|
/*
|
|
Go forwards.
|
|
*/
|
|
settings4.setValue("key 1", QString("doodah"));
|
|
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("doodah"));
|
|
QCOMPARE(settings2.value("key 1").toString(), QString("doodah"));
|
|
QCOMPARE(settings3.value("key 1").toString(), QString("doodah"));
|
|
QCOMPARE(settings4.value("key 1").toString(), QString("doodah"));
|
|
|
|
settings3.setValue("key 1", QString("blah"));
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("blah"));
|
|
QCOMPARE(settings2.value("key 1").toString(), QString("doodah"));
|
|
QCOMPARE(settings3.value("key 1").toString(), QString("blah"));
|
|
QCOMPARE(settings4.value("key 1").toString(), QString("doodah"));
|
|
|
|
settings2.setValue("key 1", QString("whoa"));
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("whoa"));
|
|
QCOMPARE(settings2.value("key 1").toString(), QString("whoa"));
|
|
QCOMPARE(settings3.value("key 1").toString(), QString("blah"));
|
|
QCOMPARE(settings4.value("key 1").toString(), QString("doodah"));
|
|
|
|
settings1.setValue("key 1", QString("gurgle"));
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("gurgle"));
|
|
QCOMPARE(settings2.value("key 1").toString(), QString("whoa"));
|
|
QCOMPARE(settings3.value("key 1").toString(), QString("blah"));
|
|
QCOMPARE(settings4.value("key 1").toString(), QString("doodah"));
|
|
|
|
/*
|
|
Test the copies.
|
|
*/
|
|
QCOMPARE(settings5.value("key 1").toString(), settings1.value("key 1").toString());
|
|
QCOMPARE(settings6.value("key 1").toString(), settings2.value("key 1").toString());
|
|
QCOMPARE(settings7.value("key 1").toString(), settings3.value("key 1").toString());
|
|
QCOMPARE(settings8.value("key 1").toString(), settings4.value("key 1").toString());
|
|
|
|
/*
|
|
Go backwards.
|
|
*/
|
|
|
|
settings2.setValue("key 1", QString("bilboh"));
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("gurgle"));
|
|
QCOMPARE(settings2.value("key 1").toString(), QString("bilboh"));
|
|
QCOMPARE(settings3.value("key 1").toString(), QString("blah"));
|
|
QCOMPARE(settings4.value("key 1").toString(), QString("doodah"));
|
|
|
|
settings3.setValue("key 1", QString("catha"));
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("gurgle"));
|
|
QCOMPARE(settings2.value("key 1").toString(), QString("bilboh"));
|
|
QCOMPARE(settings3.value("key 1").toString(), QString("catha"));
|
|
QCOMPARE(settings4.value("key 1").toString(), QString("doodah"));
|
|
|
|
settings4.setValue("key 1", QString("quirko"));
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("gurgle"));
|
|
QCOMPARE(settings2.value("key 1").toString(), QString("bilboh"));
|
|
QCOMPARE(settings3.value("key 1").toString(), QString("catha"));
|
|
QCOMPARE(settings4.value("key 1").toString(), QString("quirko"));
|
|
|
|
/*
|
|
Test the copies again.
|
|
*/
|
|
QCOMPARE(settings5.value("key 1").toString(), settings1.value("key 1").toString());
|
|
QCOMPARE(settings6.value("key 1").toString(), settings2.value("key 1").toString());
|
|
QCOMPARE(settings7.value("key 1").toString(), settings3.value("key 1").toString());
|
|
QCOMPARE(settings8.value("key 1").toString(), settings4.value("key 1").toString());
|
|
|
|
/*
|
|
"General" is a problem key for .ini files.
|
|
*/
|
|
settings1.setValue("General", 1);
|
|
settings1.setValue("%General", 2);
|
|
settings1.setValue("alpha", 3);
|
|
settings1.setValue("General/alpha", 4);
|
|
settings1.setValue("%General/alpha", 5);
|
|
settings1.setValue("alpha/General", 6);
|
|
settings1.setValue("alpha/%General", 7);
|
|
settings1.setValue("General/General", 8);
|
|
settings1.setValue("General/%General", 9);
|
|
settings1.setValue("%General/General", 10);
|
|
settings1.setValue("%General/%General", 11);
|
|
}
|
|
|
|
{
|
|
/*
|
|
Test that the data was stored on disk after all instances
|
|
of QSettings are destroyed.
|
|
*/
|
|
|
|
QSettings settings1(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
QSettings settings2(format, QSettings::UserScope, "software.org");
|
|
QSettings settings3(format, QSettings::SystemScope, "software.org", "KillerAPP");
|
|
QSettings settings4(format, QSettings::SystemScope, "software.org");
|
|
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("gurgle"));
|
|
QCOMPARE(settings2.value("key 1").toString(), QString("bilboh"));
|
|
QCOMPARE(settings3.value("key 1").toString(), QString("catha"));
|
|
QCOMPARE(settings4.value("key 1").toString(), QString("quirko"));
|
|
|
|
/*
|
|
Test problem keys.
|
|
*/
|
|
|
|
QCOMPARE(settings1.value("General").toInt(), 1);
|
|
QCOMPARE(settings1.value("%General").toInt(), 2);
|
|
QCOMPARE(settings1.value("alpha").toInt(), 3);
|
|
QCOMPARE(settings1.value("General/alpha").toInt(), 4);
|
|
QCOMPARE(settings1.value("%General/alpha").toInt(), 5);
|
|
QCOMPARE(settings1.value("alpha/General").toInt(), 6);
|
|
QCOMPARE(settings1.value("alpha/%General").toInt(), 7);
|
|
QCOMPARE(settings1.value("General/General").toInt(), 8);
|
|
QCOMPARE(settings1.value("General/%General").toInt(), 9);
|
|
QCOMPARE(settings1.value("%General/General").toInt(), 10);
|
|
QCOMPARE(settings1.value("%General/%General").toInt(), 11);
|
|
|
|
/*
|
|
Test that the organization and product parameters is
|
|
case-insensitive on Windows and Mac, case-sensitive on
|
|
Unix.
|
|
*/
|
|
QSettings settings5(format, QSettings::UserScope, "SoftWare.ORG", "killerApp");
|
|
if (format == QSettings::NativeFormat) {
|
|
#if defined(Q_OS_WIN) || defined(Q_OS_DARWIN) || defined(Q_OS_SYMBIAN)
|
|
QCOMPARE(settings5.value("key 1").toString(), QString("gurgle"));
|
|
#else
|
|
QVERIFY(!settings5.contains("key 1"));
|
|
#endif
|
|
} else {
|
|
#if defined(Q_OS_WIN) || defined(Q_OS_DARWIN) || defined(Q_OS_SYMBIAN)
|
|
QCOMPARE(settings5.value("key 1").toString(), QString("gurgle"));
|
|
#else
|
|
QVERIFY(!settings5.contains("key 1"));
|
|
#endif
|
|
}
|
|
}
|
|
|
|
{
|
|
QSettings settings1(settingsPath("custom/custom.conf"), QSettings::IniFormat);
|
|
settings1.beginGroup("alpha/beta");
|
|
settings1.setValue("geometry", -7);
|
|
settings1.setValue("geometry/x", 1);
|
|
settings1.setValue("geometry/y", 2);
|
|
QSettings settings2(settingsPath("custom/custom.conf"), QSettings::IniFormat);
|
|
settings1.setValue("geometry/width", 3);
|
|
settings2.setValue("alpha/beta/geometry/height", 4);
|
|
settings2.setValue("alpha/gamma/splitter", 5);
|
|
settings1.endGroup();
|
|
|
|
// test QSettings::scope() while we're at it
|
|
QVERIFY(settings1.scope() == QSettings::UserScope);
|
|
|
|
// test QSettings::organizationName() while we're at it
|
|
QVERIFY(settings1.organizationName().isEmpty());
|
|
|
|
// test QSettings::applicationName() while we're at it
|
|
QVERIFY(settings1.organizationName().isEmpty());
|
|
|
|
QSettings settings3(settingsPath("custom/custom2.conf"), QSettings::IniFormat);
|
|
settings3.beginGroup("doodley/beta");
|
|
settings3.setValue("geometry", -7);
|
|
settings3.setValue("geometry/x", 1);
|
|
settings3.setValue("geometry/y", 2);
|
|
settings3.setValue("geometry/width", 3);
|
|
settings3.setValue("geometry/height", 4);
|
|
settings3.endGroup();
|
|
settings3.setValue("alpha/gamma/splitter", 5);
|
|
|
|
QCOMPARE(settings1.value("alpha/beta/geometry").toInt(), -7);
|
|
QCOMPARE(settings1.value("alpha/beta/geometry/x").toInt(), 1);
|
|
QCOMPARE(settings1.value("alpha/beta/geometry/y").toInt(), 2);
|
|
QCOMPARE(settings1.value("alpha/beta/geometry/width").toInt(), 3);
|
|
QCOMPARE(settings1.value("alpha/beta/geometry/height").toInt(), 4);
|
|
QCOMPARE(settings1.value("alpha/gamma/splitter").toInt(), 5);
|
|
QCOMPARE(settings1.allKeys().count(), 6);
|
|
|
|
QCOMPARE(settings2.value("alpha/beta/geometry").toInt(), -7);
|
|
QCOMPARE(settings2.value("alpha/beta/geometry/x").toInt(), 1);
|
|
QCOMPARE(settings2.value("alpha/beta/geometry/y").toInt(), 2);
|
|
QCOMPARE(settings2.value("alpha/beta/geometry/width").toInt(), 3);
|
|
QCOMPARE(settings2.value("alpha/beta/geometry/height").toInt(), 4);
|
|
QCOMPARE(settings2.value("alpha/gamma/splitter").toInt(), 5);
|
|
QCOMPARE(settings2.allKeys().count(), 6);
|
|
}
|
|
|
|
{
|
|
QSettings settings1(settingsPath("custom/custom.conf"), QSettings::IniFormat);
|
|
QCOMPARE(settings1.value("alpha/beta/geometry").toInt(), -7);
|
|
QCOMPARE(settings1.value("alpha/beta/geometry/x").toInt(), 1);
|
|
QCOMPARE(settings1.value("alpha/beta/geometry/y").toInt(), 2);
|
|
QCOMPARE(settings1.value("alpha/beta/geometry/width").toInt(), 3);
|
|
QCOMPARE(settings1.value("alpha/beta/geometry/height").toInt(), 4);
|
|
QCOMPARE(settings1.value("alpha/gamma/splitter").toInt(), 5);
|
|
QCOMPARE(settings1.allKeys().count(), 6);
|
|
}
|
|
|
|
{
|
|
// QSettings's default constructor is native by default
|
|
if (format == QSettings::NativeFormat) {
|
|
QCoreApplication::instance()->setOrganizationName("");
|
|
QCoreApplication::instance()->setApplicationName("");
|
|
QSettings settings;
|
|
QCOMPARE(settings.status(), QSettings::AccessError);
|
|
QCoreApplication::instance()->setOrganizationName("software.org");
|
|
QCoreApplication::instance()->setApplicationName("KillerAPP");
|
|
QSettings settings2;
|
|
QCOMPARE(settings2.status(), QSettings::NoError);
|
|
QSettings settings3("software.org", "KillerAPP");
|
|
QCOMPARE(settings2.fileName(), settings3.fileName());
|
|
QCoreApplication::instance()->setOrganizationName("");
|
|
QCoreApplication::instance()->setApplicationName("");
|
|
}
|
|
|
|
QSettings settings(format, QSettings::UserScope, "", "");
|
|
QCOMPARE(settings.status(), QSettings::AccessError);
|
|
QSettings settings2(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
QCOMPARE(settings2.status(), QSettings::NoError);
|
|
|
|
// test QSettings::format() while we're at it
|
|
QVERIFY(settings.format() == format);
|
|
QVERIFY(settings2.format() == format);
|
|
|
|
// test QSettings::scope() while we're at it
|
|
QVERIFY(settings.scope() == QSettings::UserScope);
|
|
QVERIFY(settings2.scope() == QSettings::UserScope);
|
|
|
|
// test QSettings::organizationName() while we're at it
|
|
QVERIFY(settings.organizationName().isEmpty());
|
|
QVERIFY(settings2.organizationName() == "software.org");
|
|
|
|
// test QSettings::applicationName() while we're at it
|
|
QVERIFY(settings.applicationName().isEmpty());
|
|
QVERIFY(settings2.applicationName() == "KillerAPP");
|
|
}
|
|
}
|
|
|
|
void tst_QSettings::testByteArray_data()
|
|
{
|
|
QTest::addColumn<QByteArray>("data");
|
|
|
|
QByteArray bytes("Hello world!");
|
|
|
|
QTest::newRow("latin1") << bytes;
|
|
#ifndef QT_NO_COMPRESS
|
|
QTest::newRow("compressed") << qCompress(bytes);
|
|
#endif
|
|
QTest::newRow("with \\0") << bytes + '\0' + bytes;
|
|
}
|
|
|
|
void tst_QSettings::testByteArray()
|
|
{
|
|
QFETCH(QByteArray, data);
|
|
|
|
// write
|
|
{
|
|
QSettings settings("Trolltech", "tst_qsettings");
|
|
settings.setValue("byteArray", data);
|
|
}
|
|
// read
|
|
{
|
|
QSettings settings("Trolltech", "tst_qsettings");
|
|
QByteArray ret = settings.value("byteArray", data).toByteArray();
|
|
QCOMPARE(ret, data);
|
|
}
|
|
}
|
|
|
|
void tst_QSettings::testErrorHandling_data()
|
|
{
|
|
QTest::addColumn<int>("filePerms"); // -1 means file should not exist
|
|
QTest::addColumn<int>("dirPerms");
|
|
QTest::addColumn<int>("statusAfterCtor");
|
|
QTest::addColumn<bool>("shouldBeEmpty");
|
|
QTest::addColumn<int>("statusAfterGet");
|
|
QTest::addColumn<int>("statusAfterSetAndSync");
|
|
|
|
// file dir afterCtor empty afterGet afterSetAndSync
|
|
QTest::newRow("0600 0700") << 0600 << 0700 << (int)QSettings::NoError << false << (int)QSettings::NoError << (int)QSettings::NoError;
|
|
|
|
QTest::newRow("0400 0700") << 0400 << 0700 << (int)QSettings::NoError
|
|
<< false << (int)QSettings::NoError << (int)QSettings::AccessError;
|
|
QTest::newRow("0200 0700") << 0200 << 0700 << (int)QSettings::AccessError
|
|
<< true << (int)QSettings::AccessError << (int)QSettings::AccessError;
|
|
|
|
QTest::newRow(" -1 0700") << -1 << 0700 << (int)QSettings::NoError << true << (int)QSettings::NoError << (int)QSettings::NoError;
|
|
|
|
QTest::newRow(" -1 0000") << -1 << 0000 << (int)QSettings::NoError << true << (int)QSettings::NoError << (int)QSettings::AccessError;
|
|
QTest::newRow(" -1 0100") << -1 << 0100 << (int)QSettings::NoError << true << (int)QSettings::NoError << (int)QSettings::AccessError;
|
|
QTest::newRow("0600 0100") << 0600 << 0100 << (int)QSettings::NoError << false << (int)QSettings::NoError << (int)QSettings::NoError;
|
|
QTest::newRow(" -1 0300") << -1 << 0300 << (int)QSettings::NoError << true << (int)QSettings::NoError << (int)QSettings::NoError;
|
|
QTest::newRow("0600 0300") << 0600 << 0300 << (int)QSettings::NoError << false << (int)QSettings::NoError << (int)QSettings::NoError;
|
|
QTest::newRow(" -1 0500") << -1 << 0500 << (int)QSettings::NoError << true << (int)QSettings::NoError << (int)QSettings::AccessError;
|
|
QTest::newRow("0600 0500") << 0600 << 0500 << (int)QSettings::NoError << false << (int)QSettings::NoError << (int)QSettings::NoError;
|
|
}
|
|
|
|
void tst_QSettings::testErrorHandling()
|
|
{
|
|
#ifdef QT_BUILD_INTERNAL
|
|
#ifdef Q_OS_WIN
|
|
QSKIP("Windows doesn't support most file modes, including read-only directories, so this test is moot.", SkipAll);
|
|
#elif defined(Q_OS_SYMBIAN)
|
|
QSKIP("Symbian/Open C doesn't support execute or write only file modes, or directory permissions, so this test is mostly moot.", SkipAll);
|
|
#elif defined(Q_OS_UNIX)
|
|
if (::getuid() == 0)
|
|
QSKIP("Running this test as root doesn't work, since file perms do not bother him", SkipAll);
|
|
#else
|
|
QFETCH(int, filePerms);
|
|
QFETCH(int, dirPerms);
|
|
QFETCH(int, statusAfterCtor);
|
|
QFETCH(bool, shouldBeEmpty);
|
|
QFETCH(int, statusAfterGet);
|
|
QFETCH(int, statusAfterSetAndSync);
|
|
|
|
system(QString("chmod 700 %1 2>/dev/null").arg(settingsPath("someDir")).toLatin1());
|
|
system(QString("chmod -R u+rwx %1 2>/dev/null").arg(settingsPath("someDir")).toLatin1());
|
|
system(QString("rm -fr %1").arg(settingsPath("someDir")).toLatin1());
|
|
|
|
// prepare a file with some settings
|
|
if (filePerms != -1) {
|
|
QSettings settings(settingsPath("someDir/someSettings.ini"), QSettings::IniFormat);
|
|
QCOMPARE((int) settings.status(), (int) QSettings::NoError);
|
|
|
|
settings.beginGroup("alpha/beta");
|
|
settings.setValue("geometry", -7);
|
|
settings.setValue("geometry/x", 1);
|
|
settings.setValue("geometry/y", 2);
|
|
settings.setValue("geometry/width", 3);
|
|
settings.setValue("geometry/height", 4);
|
|
settings.endGroup();
|
|
settings.setValue("alpha/gamma/splitter", 5);
|
|
} else {
|
|
system(QString("mkdir -p %1").arg(settingsPath("someDir")).toLatin1());
|
|
}
|
|
|
|
if (filePerms != -1) {
|
|
system(QString("chmod %1 %2")
|
|
.arg(QString::number(filePerms, 8))
|
|
.arg(settingsPath("someDir/someSettings.ini"))
|
|
.toLatin1());
|
|
}
|
|
system(QString("chmod %1 %2")
|
|
.arg(QString::number(dirPerms, 8))
|
|
.arg(settingsPath("someDir"))
|
|
.toLatin1());
|
|
|
|
// the test
|
|
{
|
|
QConfFile::clearCache();
|
|
QSettings settings(settingsPath("someDir/someSettings.ini"), QSettings::IniFormat);
|
|
QCOMPARE((int)settings.status(), statusAfterCtor);
|
|
if (shouldBeEmpty) {
|
|
QCOMPARE(settings.allKeys().count(), 0);
|
|
} else {
|
|
QVERIFY(settings.allKeys().count() > 0);
|
|
}
|
|
settings.value("alpha/beta/geometry");
|
|
QCOMPARE((int)settings.status(), statusAfterGet);
|
|
settings.setValue("alpha/beta/geometry", 100);
|
|
QCOMPARE((int)settings.status(), statusAfterGet);
|
|
QCOMPARE(settings.value("alpha/beta/geometry").toInt(), 100);
|
|
settings.sync();
|
|
QCOMPARE(settings.value("alpha/beta/geometry").toInt(), 100);
|
|
QCOMPARE((int)settings.status(), statusAfterSetAndSync);
|
|
}
|
|
#endif // !Q_OS_WIN
|
|
#endif
|
|
}
|
|
|
|
Q_DECLARE_METATYPE(QVariant)
|
|
Q_DECLARE_METATYPE(QSettings::Status)
|
|
|
|
void tst_QSettings::testIniParsing_data()
|
|
{
|
|
QTest::addColumn<QByteArray>("inicontent");
|
|
QTest::addColumn<QString>("key");
|
|
QTest::addColumn<QVariant>("expect");
|
|
QTest::addColumn<QSettings::Status>("status");
|
|
|
|
// Test "forgiving" parsing of entries not terminated with newline or unterminated strings
|
|
QTest::newRow("good1") << QByteArray("v=1\n") << "v" << QVariant(1) << QSettings::NoError;
|
|
QTest::newRow("good2") << QByteArray("v=1\\\n2") << "v" << QVariant(12) << QSettings::NoError;
|
|
QTest::newRow("good3") << QByteArray("v=1\\\r2") << "v" << QVariant(12) << QSettings::NoError;
|
|
QTest::newRow("good4") << QByteArray("v=1\\\n\r2") << "v" << QVariant(12) << QSettings::NoError;
|
|
QTest::newRow("good5") << QByteArray("v=1\\\r\n2") << "v" << QVariant(12) << QSettings::NoError;
|
|
QTest::newRow("good6") << QByteArray("v \t = \t 1\\\r\n2") << "v" << QVariant(12) << QSettings::NoError;
|
|
QTest::newRow("garbage1") << QByteArray("v") << "v" << QVariant() << QSettings::FormatError;
|
|
QTest::newRow("nonterm1") << QByteArray("v=str") << "v" << QVariant("str") << QSettings::NoError;
|
|
QTest::newRow("nonterm2") << QByteArray("v=\"str\"") << "v" << QVariant("str") << QSettings::NoError;
|
|
QTest::newRow("nonterm3") << QByteArray("v=\"str") << "v" << QVariant("str") << QSettings::NoError;
|
|
QTest::newRow("nonterm4") << QByteArray("v=\\") << "v" << QVariant("") << QSettings::NoError;
|
|
QTest::newRow("nonterm5") << QByteArray("u=s\nv=\"str") << "v" << QVariant("str") << QSettings::NoError;
|
|
QTest::newRow("nonterm6") << QByteArray("v=\"str\nw=ok") << "v" << QVariant("str\nw=ok") << QSettings::NoError;
|
|
QTest::newRow("nonterm7") << QByteArray("v=") << "v" << QVariant("") << QSettings::NoError;
|
|
QTest::newRow("nonterm8") << QByteArray("v=\"str\njnk") << "v" << QVariant("str\njnk") << QSettings::NoError;
|
|
QTest::newRow("nonterm9") << QByteArray("v=1\\") << "v" << QVariant(1) << QSettings::NoError;
|
|
QTest::newRow("nonterm10") << QByteArray("v=1\\\n") << "v" << QVariant(1) << QSettings::NoError;
|
|
QTest::newRow("nonterm11") << QByteArray("v=1\\\r") << "v" << QVariant(1) << QSettings::NoError;
|
|
QTest::newRow("nonterm12") << QByteArray("v=1\\\n\r") << "v" << QVariant(1) << QSettings::NoError;
|
|
QTest::newRow("nonterm13") << QByteArray("v=1\\\r\n") << "v" << QVariant(1) << QSettings::NoError;
|
|
QTest::newRow("nonterm14") << QByteArray("v=1\\\n\nx=2") << "v" << QVariant(1) << QSettings::NoError;
|
|
QTest::newRow("nonterm15") << QByteArray("v=1\\\r\rx=2") << "v" << QVariant(1) << QSettings::NoError;
|
|
QTest::newRow("nonterm16") << QByteArray("v=1\\\n\n\nx=2") << "v" << QVariant(1) << QSettings::NoError;
|
|
QTest::newRow("nonterm17") << QByteArray("; foo\nv=1") << "v" << QVariant(1) << QSettings::NoError;
|
|
QTest::newRow("nonterm18") << QByteArray("; foo\n\nv=1") << "v" << QVariant(1) << QSettings::NoError;
|
|
QTest::newRow("nonterm19") << QByteArray("\nv=1;foo") << "v" << QVariant(1) << QSettings::NoError;
|
|
QTest::newRow("nonterm20") << QByteArray("v=x ") << "v" << QVariant("x") << QSettings::NoError;
|
|
QTest::newRow("nonterm21") << QByteArray("v=x ;") << "v" << QVariant("x") << QSettings::NoError;
|
|
}
|
|
|
|
void tst_QSettings::testIniParsing()
|
|
{
|
|
#ifdef QT_BUILD_INTERNAL
|
|
qRegisterMetaType<QVariant>("QVariant");
|
|
qRegisterMetaType<QSettings::Status>("QSettings::Status");
|
|
|
|
QDir dir(settingsPath());
|
|
QVERIFY(dir.mkpath("someDir"));
|
|
QFile f(dir.path()+"/someDir/someSettings.ini");
|
|
|
|
QFETCH(QByteArray, inicontent);
|
|
QFETCH(QString, key);
|
|
QFETCH(QVariant, expect);
|
|
QFETCH(QSettings::Status, status);
|
|
|
|
QVERIFY(f.open(QFile::WriteOnly));
|
|
f.write(inicontent);
|
|
f.close();
|
|
|
|
QConfFile::clearCache();
|
|
QSettings settings(settingsPath("someDir/someSettings.ini"), QSettings::IniFormat);
|
|
|
|
if ( settings.status() == QSettings::NoError ) { // else no point proceeding
|
|
QVariant v = settings.value(key);
|
|
QVERIFY(v.canConvert(expect.type()));
|
|
// check some types so as to give prettier error messages
|
|
if ( v.type() == QVariant::String ) {
|
|
QCOMPARE(v.toString(), expect.toString());
|
|
} else if ( v.type() == QVariant::Int ) {
|
|
QCOMPARE(v.toInt(), expect.toInt());
|
|
} else {
|
|
QCOMPARE(v, expect);
|
|
}
|
|
}
|
|
|
|
QCOMPARE(settings.status(), status);
|
|
#endif
|
|
}
|
|
|
|
/*
|
|
Tests beginGroup(), endGroup(), and group().
|
|
*/
|
|
void tst_QSettings::beginGroup()
|
|
{
|
|
QSettings settings1(QSettings::UserScope, "software.org", "KillerAPP");
|
|
QSettings settings2(QSettings::UserScope, "software.org", "KillerAPP");
|
|
|
|
/*
|
|
Let's start with some back and forthing.
|
|
*/
|
|
|
|
settings1.beginGroup("alpha");
|
|
QCOMPARE(settings1.group(), QString("alpha"));
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString());
|
|
settings1.beginGroup("/beta");
|
|
QCOMPARE(settings1.group(), QString("beta"));
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString());
|
|
|
|
settings1.beginGroup("///gamma//");
|
|
QCOMPARE(settings1.group(), QString("gamma"));
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString());
|
|
|
|
settings1.setValue("geometry", 5);
|
|
QCOMPARE(settings1.value("geometry").toInt(), 5);
|
|
QCOMPARE(settings1.value("/geometry///").toInt(), 5);
|
|
QCOMPARE(settings2.value("geometry").toInt(), 5);
|
|
QCOMPARE(settings2.value("/geometry///").toInt(), 5);
|
|
|
|
/*
|
|
OK, now start for real.
|
|
*/
|
|
|
|
settings1.beginGroup("alpha");
|
|
QCOMPARE(settings1.group(), QString("alpha"));
|
|
settings1.setValue("geometry", 66);
|
|
QCOMPARE(settings1.value("geometry").toInt(), 66);
|
|
QCOMPARE(settings2.value("geometry").toInt(), 5);
|
|
QCOMPARE(settings2.value("alpha/geometry").toInt(), 66);
|
|
|
|
QSettings settings3(QSettings::UserScope, "software.org", "KillerAPP");
|
|
settings3.beginGroup("alpha");
|
|
QCOMPARE(settings3.value("geometry").toInt(), 66);
|
|
|
|
settings1.beginGroup("/beta///");
|
|
QCOMPARE(settings1.group(), QString("alpha/beta"));
|
|
settings1.setValue("geometry", 777);
|
|
QCOMPARE(settings1.value("geometry").toInt(), 777);
|
|
QCOMPARE(settings2.value("geometry").toInt(), 5);
|
|
QCOMPARE(settings2.value("alpha/geometry").toInt(), 66);
|
|
QCOMPARE(settings2.value("alpha/beta/geometry").toInt(), 777);
|
|
QCOMPARE(settings3.value("geometry").toInt(), 66);
|
|
QCOMPARE(settings3.value("beta/geometry").toInt(), 777);
|
|
|
|
settings3.beginGroup("gamma");
|
|
settings3.setValue("geometry", 8888);
|
|
QCOMPARE(settings3.value("geometry").toInt(), 8888);
|
|
QCOMPARE(settings2.value("geometry").toInt(), 5);
|
|
QCOMPARE(settings2.value("alpha/geometry").toInt(), 66);
|
|
QCOMPARE(settings2.value("alpha/beta/geometry").toInt(), 777);
|
|
QCOMPARE(settings2.value("alpha/gamma/geometry").toInt(), 8888);
|
|
QCOMPARE(settings1.value("geometry").toInt(), 777);
|
|
|
|
// endGroup() should do nothing if group() is empty
|
|
for (int i = 0; i < 10; ++i)
|
|
settings2.endGroup();
|
|
QCOMPARE(settings2.value("geometry").toInt(), 5);
|
|
QCOMPARE(settings2.value("alpha/geometry").toInt(), 66);
|
|
QCOMPARE(settings2.value("alpha/beta/geometry").toInt(), 777);
|
|
QCOMPARE(settings2.value("alpha/gamma/geometry").toInt(), 8888);
|
|
|
|
QCOMPARE(settings1.group(), QString("alpha/beta"));
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString("alpha"));
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString());
|
|
QCOMPARE(settings1.value("geometry").toInt(), 5);
|
|
QCOMPARE(settings1.value("alpha/geometry").toInt(), 66);
|
|
QCOMPARE(settings1.value("alpha/beta/geometry").toInt(), 777);
|
|
QCOMPARE(settings1.value("alpha/gamma/geometry").toInt(), 8888);
|
|
|
|
settings1.beginGroup("delta");
|
|
QCOMPARE(settings1.group(), QString("delta"));
|
|
settings1.beginGroup("");
|
|
QCOMPARE(settings1.group(), QString("delta"));
|
|
settings1.beginGroup("/");
|
|
QCOMPARE(settings1.group(), QString("delta"));
|
|
settings1.beginGroup("////");
|
|
QCOMPARE(settings1.group(), QString("delta"));
|
|
settings1.beginGroup("////omega///epsilon zeta eta theta/ / /");
|
|
QCOMPARE(settings1.group(), QString("delta/omega/epsilon zeta eta theta/ / "));
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString("delta"));
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString("delta"));
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString("delta"));
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString("delta"));
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString());
|
|
}
|
|
|
|
/*
|
|
Tests setValue() and getXxx().
|
|
*/
|
|
void tst_QSettings::setValue()
|
|
{
|
|
QSettings settings(QSettings::UserScope, "software.org", "KillerAPP");
|
|
|
|
settings.setValue("key 2", (int)0x7fffffff);
|
|
QCOMPARE(settings.value("key 2").toInt(), (int)0x7fffffff);
|
|
QCOMPARE(settings.value("key 2").toString(), QString::number((int)0x7fffffff));
|
|
settings.setValue("key 2", -1);
|
|
QCOMPARE(settings.value("key 2").toInt(), -1);
|
|
QCOMPARE(settings.value("key 2").toString(), QString("-1"));
|
|
settings.setValue("key 2", (int)0x80000000);
|
|
QCOMPARE(settings.value("key 2").toInt(), (int)0x80000000);
|
|
settings.setValue("key 2", (int)0);
|
|
QCOMPARE(settings.value("key 2", 123).toInt(), (int)0);
|
|
settings.setValue("key 2", (int)12345);
|
|
QCOMPARE(settings.value("key 2").toInt(), (int)12345);
|
|
QCOMPARE(settings.value("no such key", 1234).toInt(), (int)1234);
|
|
QCOMPARE(settings.value("no such key").toInt(), (int)0);
|
|
|
|
settings.setValue("key 2", true);
|
|
QCOMPARE(settings.value("key 2").toBool(), true);
|
|
settings.setValue("key 2", false);
|
|
QCOMPARE(settings.value("key 2", true).toBool(), false);
|
|
settings.setValue("key 2", (int)1);
|
|
QCOMPARE(settings.value("key 2").toBool(), true);
|
|
settings.setValue("key 2", (int)-1);
|
|
QCOMPARE(settings.value("key 2").toBool(), true);
|
|
settings.setValue("key 2", (int)0);
|
|
QCOMPARE(settings.value("key 2", true).toBool(), false);
|
|
settings.setValue("key 2", QString("true"));
|
|
QCOMPARE(settings.value("key 2").toBool(), true);
|
|
settings.setValue("key 2", QString("false"));
|
|
QCOMPARE(settings.value("key 2", true).toBool(), false);
|
|
/*
|
|
settings.setValue("key 2", "true");
|
|
QCOMPARE(settings.value("key 2").toBool(), true);
|
|
settings.setValue("key 2", "false");
|
|
QCOMPARE(settings.value("key 2", true).toBool(), false);
|
|
settings.setValue("key 2", "");
|
|
QCOMPARE(settings.value("key 2", true).toBool(), true);
|
|
settings.setValue("key 2", "");
|
|
QCOMPARE(settings.value("key 2", false).toBool(), false);
|
|
settings.setValue("key 2", "0.000e-00"); // cannot convert double to a bool
|
|
QCOMPARE(settings.value("key 2", true).toBool(), true);
|
|
settings.setValue("key 2", "0.000e-00");
|
|
QCOMPARE(settings.value("key 2", false).toBool(), false);
|
|
|
|
*/
|
|
settings.setValue("key 2", QStringList());
|
|
QCOMPARE(settings.value("key 2").toStringList(), QStringList());
|
|
settings.setValue("key 2", QStringList(""));
|
|
QCOMPARE(settings.value("key 2").toStringList(), QStringList(""));
|
|
settings.setValue("key 2", QStringList() << "" << "");
|
|
QCOMPARE(settings.value("key 2").toStringList(), QStringList() << "" << "");
|
|
settings.setValue("key 2", QStringList() << "" << "a" << "" << "bc" << "");
|
|
QCOMPARE(settings.value("key 2").toStringList(), QStringList() << "" << "a" << "" << "bc" << "");
|
|
|
|
settings.setValue("key 3", QList<QVariant>());
|
|
QCOMPARE(settings.value("key 3").toList(), QList<QVariant>());
|
|
settings.setValue("key 3", QList<QVariant>() << 1 << QString("a"));
|
|
QCOMPARE(settings.value("key 3").toList(), QList<QVariant>() << 1 << QString("a"));
|
|
|
|
QList<QVariant> outerList;
|
|
outerList << 1 << QString("b");
|
|
QList<QVariant> innerList = outerList;
|
|
outerList.append(QVariant(innerList));
|
|
outerList.append(QVariant(innerList));
|
|
outerList << 2 << QString("c");
|
|
innerList = outerList;
|
|
outerList.append(QVariant(innerList));
|
|
// outerList: [1, "b", [1, "b"], [1, "b"], 2, "c", [1, "b", [1, "b"], [1, "b"], 2, "c"]]
|
|
|
|
settings.setValue("key 3", outerList);
|
|
QCOMPARE(settings.value("key 3").toList(), outerList);
|
|
QCOMPARE(settings.value("key 3").toList().size(), 7);
|
|
|
|
QMap<QString, QVariant> map;
|
|
map.insert("1", "one");
|
|
map.insert("2", "two");
|
|
map.insert("3", outerList);
|
|
map.insert("5", "cinco");
|
|
map.insert("10", "zehn");
|
|
settings.setValue("key 4", map);
|
|
QCOMPARE(settings.value("key 4").toMap(), map);
|
|
}
|
|
|
|
void tst_QSettings::testVariantTypes_data()
|
|
{
|
|
populateWithFormats();
|
|
}
|
|
|
|
void tst_QSettings::testVariantTypes()
|
|
{
|
|
#ifdef QT_BUILD_INTERNAL
|
|
#define testVal(key, val, tp, rtype) \
|
|
{ \
|
|
QSettings settings1(format, QSettings::UserScope, "software.org", "KillerAPP"); \
|
|
settings1.setValue(key, qVariantFromValue(val)); \
|
|
} \
|
|
QConfFile::clearCache(); \
|
|
{ \
|
|
QSettings settings2(format, QSettings::UserScope, "software.org", "KillerAPP"); \
|
|
QVariant v = settings2.value(key); \
|
|
QVERIFY(qvariant_cast<tp >(v) == val); \
|
|
QVERIFY(v.type() == QVariant::rtype); \
|
|
}
|
|
|
|
typedef QMap<QString, QVariant> TestVariantMap;
|
|
|
|
QFETCH(QSettings::Format, format);
|
|
|
|
TestVariantMap m2;
|
|
m2.insert("ene", "due");
|
|
m2.insert("rike", "fake");
|
|
m2.insert("borba", "dorba");
|
|
testVal("key2", m2, TestVariantMap, Map);
|
|
|
|
QStringList l2;
|
|
|
|
l2 << "ene" << "due" << "@Point(1 2)" << "@fake";
|
|
testVal("key3", l2, QStringList, StringList);
|
|
|
|
l2.clear();
|
|
l2 << "ene" << "due" << "rike" << "fake";
|
|
testVal("key3", l2, QStringList, StringList);
|
|
|
|
QList<QVariant> l3;
|
|
QDate date = QDate::currentDate();
|
|
QTime time = QTime::currentTime();
|
|
l3 << QString("ene") << 10 << qVariantFromValue(QColor(1, 2, 3)) << QVariant(QRect(1, 2, 3, 4))
|
|
<< QVariant(QSize(4, 56)) << QVariant(QPoint(4, 2)) << true << false << date << time;
|
|
testVal("key3", l3, QVariantList, List);
|
|
|
|
testVal("key4", QString("hello"), QString, String);
|
|
testVal("key5", QColor(1, 2, 3), QColor, Color);
|
|
testVal("key6", QRect(1, 2, 3, 4), QRect, Rect);
|
|
testVal("key7", QSize(4, 56), QSize, Size);
|
|
testVal("key8", QPoint(4, 2), QPoint, Point);
|
|
testVal("key10", date, QDate, Date);
|
|
testVal("key11", time, QTime, Time);
|
|
testVal("key12", QByteArray("foo bar"), QByteArray, ByteArray);
|
|
|
|
{
|
|
QSettings settings(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
QVERIFY(!settings.contains("key99"));
|
|
QCOMPARE(settings.value("key99"), QVariant());
|
|
|
|
settings.setValue("key99", QVariant());
|
|
QVERIFY(settings.contains("key99"));
|
|
QCOMPARE(settings.value("key99"), QVariant());
|
|
|
|
settings.setValue("key99", QVariant(1));
|
|
QVERIFY(settings.contains("key99"));
|
|
QCOMPARE(settings.value("key99"), QVariant(1));
|
|
|
|
settings.setValue("key99", QVariant());
|
|
QVERIFY(settings.contains("key99"));
|
|
QCOMPARE(settings.value("key99"), QVariant());
|
|
|
|
settings.remove("key99");
|
|
QVERIFY(!settings.contains("key99"));
|
|
QCOMPARE(settings.value("key99"), QVariant());
|
|
}
|
|
|
|
QList<QVariant> l4;
|
|
l4 << QVariant(m2) << QVariant(l2) << QVariant(l3);
|
|
testVal("key13", l4, QVariantList, List);
|
|
|
|
// We store key sequences as strings instead of binary variant blob, for improved
|
|
// readability in the resulting format.
|
|
if (format >= QSettings::InvalidFormat) {
|
|
testVal("keysequence", QKeySequence(Qt::ControlModifier + Qt::Key_F1), QKeySequence, KeySequence);
|
|
} else {
|
|
testVal("keysequence", QKeySequence(Qt::ControlModifier + Qt::Key_F1), QString, String);
|
|
}
|
|
|
|
#undef testVal
|
|
#endif
|
|
}
|
|
|
|
void tst_QSettings::remove()
|
|
{
|
|
QSettings settings0(QSettings::UserScope, "software.org", "KillerAPP");
|
|
int initialNumKeys = settings0.allKeys().size();
|
|
QCOMPARE(settings0.value("key 1", "123").toString(), QString("123"));
|
|
settings0.remove("key 1");
|
|
QCOMPARE(settings0.value("key 1", "456").toString(), QString("456"));
|
|
|
|
settings0.setValue("key 1", "bubloo");
|
|
QCOMPARE(settings0.value("key 1").toString(), QString("bubloo"));
|
|
settings0.remove("key 2");
|
|
QCOMPARE(settings0.value("key 1").toString(), QString("bubloo"));
|
|
settings0.remove("key 1");
|
|
QCOMPARE(settings0.value("key 1", "789").toString(), QString("789"));
|
|
|
|
/*
|
|
Make sure that removing a key removes all the subkeys.
|
|
*/
|
|
settings0.setValue("alpha/beta/geometry", -7);
|
|
settings0.setValue("alpha/beta/geometry/x", 1);
|
|
settings0.setValue("alpha/beta/geometry/y", 2);
|
|
settings0.setValue("alpha/beta/geometry/width", 3);
|
|
settings0.setValue("alpha/beta/geometry/height", 4);
|
|
settings0.setValue("alpha/gamma/splitter", 5);
|
|
|
|
settings0.remove("alpha/beta/geometry/x");
|
|
QCOMPARE(settings0.value("alpha/beta/geometry").toInt(), -7);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/x", 999).toInt(), 999);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/y").toInt(), 2);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/width").toInt(), 3);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/height").toInt(), 4);
|
|
QCOMPARE(settings0.value("alpha/gamma/splitter").toInt(), 5);
|
|
|
|
settings0.remove("alpha/beta/geometry");
|
|
QCOMPARE(settings0.value("alpha/beta/geometry", 777).toInt(), 777);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/x", 111).toInt(), 111);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/y", 222).toInt(), 222);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/width", 333).toInt(), 333);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/height", 444).toInt(), 444);
|
|
QCOMPARE(settings0.value("alpha/gamma/splitter").toInt(), 5);
|
|
|
|
settings0.setValue("alpha/beta/geometry", -7);
|
|
settings0.setValue("alpha/beta/geometry/x", 1);
|
|
settings0.setValue("alpha/beta/geometry/y", 2);
|
|
settings0.setValue("alpha/beta/geometry/width", 3);
|
|
settings0.setValue("alpha/beta/geometry/height", 4);
|
|
settings0.setValue("alpha/gamma/splitter", 5);
|
|
QCOMPARE(settings0.allKeys().size(), initialNumKeys + 6);
|
|
|
|
settings0.beginGroup("alpha/beta/geometry");
|
|
settings0.remove("");
|
|
settings0.endGroup();
|
|
QVERIFY(!settings0.contains("alpha/beta/geometry"));
|
|
QVERIFY(!settings0.contains("alpha/beta/geometry/x"));
|
|
QVERIFY(!settings0.contains("alpha/beta/geometry/y"));
|
|
QVERIFY(!settings0.contains("alpha/beta/geometry/width"));
|
|
QVERIFY(!settings0.contains("alpha/beta/geometry/height"));
|
|
QVERIFY(settings0.contains("alpha/gamma/splitter"));
|
|
QCOMPARE(settings0.allKeys().size(), initialNumKeys + 1);
|
|
|
|
settings0.beginGroup("alpha/beta");
|
|
settings0.remove("");
|
|
settings0.endGroup();
|
|
QVERIFY(!settings0.contains("alpha/beta/geometry"));
|
|
QVERIFY(!settings0.contains("alpha/beta/geometry/x"));
|
|
QVERIFY(!settings0.contains("alpha/beta/geometry/y"));
|
|
QVERIFY(!settings0.contains("alpha/beta/geometry/width"));
|
|
QVERIFY(!settings0.contains("alpha/beta/geometry/height"));
|
|
QVERIFY(settings0.contains("alpha/gamma/splitter"));
|
|
QCOMPARE(settings0.allKeys().size(), initialNumKeys + 1);
|
|
|
|
settings0.remove("");
|
|
QVERIFY(!settings0.contains("alpha/gamma/splitter"));
|
|
QCOMPARE(settings0.allKeys().size(), initialNumKeys);
|
|
|
|
/*
|
|
Do it again, but this time let's use setGroup().
|
|
*/
|
|
|
|
settings0.setValue("alpha/beta/geometry", -7);
|
|
settings0.setValue("alpha/beta/geometry/x", 1);
|
|
settings0.setValue("alpha/beta/geometry/y", 2);
|
|
settings0.setValue("alpha/beta/geometry/width", 3);
|
|
settings0.setValue("alpha/beta/geometry/height", 4);
|
|
settings0.setValue("alpha/gamma/splitter", 5);
|
|
|
|
settings0.beginGroup("foo/bar/baz/doesn't");
|
|
settings0.remove("exist");
|
|
settings0.endGroup();
|
|
QCOMPARE(settings0.value("alpha/beta/geometry").toInt(), -7);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/x").toInt(), 1);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/y").toInt(), 2);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/width").toInt(), 3);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/height").toInt(), 4);
|
|
QCOMPARE(settings0.value("alpha/gamma/splitter").toInt(), 5);
|
|
|
|
settings0.beginGroup("alpha/beta/geometry");
|
|
settings0.remove("x");
|
|
settings0.endGroup();
|
|
QCOMPARE(settings0.value("alpha/beta/geometry").toInt(), -7);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/x", 999).toInt(), 999);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/y").toInt(), 2);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/width").toInt(), 3);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/height").toInt(), 4);
|
|
QCOMPARE(settings0.value("alpha/gamma/splitter").toInt(), 5);
|
|
|
|
settings0.remove("alpha/beta");
|
|
QCOMPARE(settings0.value("alpha/beta/geometry", 777).toInt(), 777);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/x", 111).toInt(), 111);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/y", 222).toInt(), 222);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/width", 333).toInt(), 333);
|
|
QCOMPARE(settings0.value("alpha/beta/geometry/height", 444).toInt(), 444);
|
|
QCOMPARE(settings0.value("alpha/gamma/splitter").toInt(), 5);
|
|
|
|
settings0.clear();
|
|
QCOMPARE(settings0.value("alpha/gamma/splitter", 888).toInt(), 888);
|
|
|
|
/*
|
|
OK, now let's check what happens if settings are spread across
|
|
multiple files (user vs. global, product-specific vs.
|
|
company-wide).
|
|
*/
|
|
|
|
QSettings settings1(QSettings::UserScope, "software.org", "KillerAPP");
|
|
QSettings settings2(QSettings::UserScope, "software.org");
|
|
QSettings settings3(QSettings::SystemScope, "software.org", "KillerAPP");
|
|
QSettings settings4(QSettings::SystemScope, "software.org");
|
|
|
|
settings4.setValue("key 1", "doodah");
|
|
settings3.setValue("key 1", "blah");
|
|
settings2.setValue("key 1", "whoa");
|
|
settings1.setValue("key 1", "gurgle");
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("gurgle"));
|
|
QCOMPARE(settings2.value("key 1").toString(), QString("whoa"));
|
|
QCOMPARE(settings3.value("key 1").toString(), QString("blah"));
|
|
QCOMPARE(settings4.value("key 1").toString(), QString("doodah"));
|
|
|
|
settings1.remove("key 1");
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("whoa"));
|
|
QCOMPARE(settings2.value("key 1").toString(), QString("whoa"));
|
|
QCOMPARE(settings3.value("key 1").toString(), QString("blah"));
|
|
QCOMPARE(settings4.value("key 1").toString(), QString("doodah"));
|
|
|
|
settings2.remove("key 1");
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("blah"));
|
|
QCOMPARE(settings2.value("key 1").toString(), QString("doodah"));
|
|
QCOMPARE(settings3.value("key 1").toString(), QString("blah"));
|
|
QCOMPARE(settings4.value("key 1").toString(), QString("doodah"));
|
|
|
|
settings3.remove("key 1");
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("doodah"));
|
|
QCOMPARE(settings2.value("key 1").toString(), QString("doodah"));
|
|
QCOMPARE(settings3.value("key 1").toString(), QString("doodah"));
|
|
QCOMPARE(settings4.value("key 1").toString(), QString("doodah"));
|
|
|
|
settings4.remove("key 1");
|
|
QVERIFY(!settings1.contains("key 1"));
|
|
QVERIFY(!settings2.contains("key 1"));
|
|
QVERIFY(!settings3.contains("key 1"));
|
|
QVERIFY(!settings4.contains("key 1"));
|
|
|
|
/*
|
|
Get ready for the next part of the test.
|
|
*/
|
|
|
|
settings1.clear();
|
|
settings2.clear();
|
|
settings3.clear();
|
|
settings4.clear();
|
|
|
|
settings1.sync();
|
|
settings2.sync();
|
|
settings3.sync();
|
|
settings4.sync();
|
|
|
|
/*
|
|
Check that recursive removes work correctly when some of the
|
|
keys are loaded from the file and others have been modified in
|
|
memory (corresponds to originalKeys vs. addedKeys in the
|
|
QSettingsFile code).
|
|
*/
|
|
|
|
settings1.setValue("alpha/beta/geometry", -7);
|
|
settings1.setValue("alpha/beta/geometry/x", 1);
|
|
settings1.setValue("alpha/beta/geometry/y", 2);
|
|
settings1.setValue("alpha/gamma/splitter", 5);
|
|
settings1.sync();
|
|
|
|
settings1.setValue("alpha/beta/geometry/width", 3);
|
|
settings1.setValue("alpha/beta/geometry/height", 4);
|
|
|
|
settings1.remove("alpha/beta/geometry/y");
|
|
QVERIFY(settings1.contains("alpha/beta/geometry"));
|
|
QVERIFY(settings1.contains("alpha/beta/geometry/x"));
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry/y"));
|
|
QVERIFY(settings1.contains("alpha/beta/geometry/width"));
|
|
QVERIFY(settings1.contains("alpha/beta/geometry/height"));
|
|
QCOMPARE(settings1.allKeys().size(), initialNumKeys + 5);
|
|
|
|
settings1.remove("alpha/beta/geometry/y");
|
|
QCOMPARE(settings1.allKeys().size(), initialNumKeys + 5);
|
|
|
|
settings1.remove("alpha/beta/geometry/height");
|
|
QVERIFY(settings1.contains("alpha/beta/geometry"));
|
|
QVERIFY(settings1.contains("alpha/beta/geometry/x"));
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry/y"));
|
|
QVERIFY(settings1.contains("alpha/beta/geometry/width"));
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry/height"));
|
|
QCOMPARE(settings1.allKeys().size(), initialNumKeys + 4);
|
|
|
|
settings1.remove("alpha/beta/geometry");
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry"));
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry/x"));
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry/y"));
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry/width"));
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry/height"));
|
|
QVERIFY(settings1.contains("alpha/gamma/splitter"));
|
|
QCOMPARE(settings1.allKeys().size(), initialNumKeys + 1);
|
|
|
|
settings1.sync();
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry"));
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry/x"));
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry/y"));
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry/width"));
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry/height"));
|
|
QVERIFY(settings1.contains("alpha/gamma/splitter"));
|
|
QCOMPARE(settings1.allKeys().size(), initialNumKeys + 1);
|
|
}
|
|
|
|
/*
|
|
Tests contains() and keys().
|
|
*/
|
|
void tst_QSettings::contains()
|
|
{
|
|
QSettings settings1(QSettings::UserScope, "software.org", "KillerAPP");
|
|
int initialNumKeys = settings1.allKeys().size(); // 0 on all platforms but Mac OS X.
|
|
settings1.setValue("alpha/beta/geometry", -7);
|
|
settings1.setValue("alpha/beta/geometry/x", 1);
|
|
settings1.setValue("alpha/beta/geometry/y", 2);
|
|
settings1.setValue("alpha/beta/geometry/width", 3);
|
|
settings1.setValue("alpha/beta/geometry/height", 4);
|
|
settings1.setValue("alpha/gamma/splitter", 5);
|
|
settings1.setValue("alpha/gamma/splitter/ /", 5);
|
|
|
|
QVERIFY(!settings1.contains("alpha"));
|
|
QVERIFY(!settings1.contains("alpha/beta"));
|
|
QVERIFY(!settings1.contains("///alpha///beta///"));
|
|
QVERIFY(settings1.contains("alpha/beta/geometry"));
|
|
QVERIFY(settings1.contains("///alpha///beta//geometry//"));
|
|
QVERIFY(settings1.contains("alpha/beta/geometry/x"));
|
|
QVERIFY(settings1.contains("alpha/beta/geometry/y"));
|
|
QVERIFY(settings1.contains("alpha/beta/geometry/width"));
|
|
QVERIFY(settings1.contains("alpha/beta/geometry/height"));
|
|
QVERIFY(!settings1.contains("alpha/beta/geometry/height/foo/bar/doesn't/exist"));
|
|
QVERIFY(!settings1.contains("alpha/gamma"));
|
|
QVERIFY(settings1.contains("alpha/gamma/splitter"));
|
|
QVERIFY(settings1.contains("alpha/gamma/splitter/ "));
|
|
QVERIFY(settings1.contains("////alpha/gamma/splitter// ////"));
|
|
|
|
settings1.beginGroup("alpha");
|
|
QVERIFY(!settings1.contains("beta"));
|
|
QVERIFY(!settings1.contains("/////beta///"));
|
|
QVERIFY(settings1.contains("beta/geometry"));
|
|
QVERIFY(settings1.contains("/////beta//geometry//"));
|
|
QVERIFY(settings1.contains("beta/geometry/x"));
|
|
QVERIFY(settings1.contains("beta/geometry/y"));
|
|
QVERIFY(settings1.contains("beta/geometry/width"));
|
|
QVERIFY(settings1.contains("beta/geometry/height"));
|
|
QVERIFY(!settings1.contains("beta/geometry/height/foo/bar/doesn't/exist"));
|
|
QVERIFY(!settings1.contains("gamma"));
|
|
QVERIFY(settings1.contains("gamma/splitter"));
|
|
QVERIFY(settings1.contains("gamma/splitter/ "));
|
|
QVERIFY(settings1.contains("////gamma/splitter// ////"));
|
|
|
|
settings1.beginGroup("beta/geometry");
|
|
QVERIFY(settings1.contains("x"));
|
|
QVERIFY(settings1.contains("y"));
|
|
QVERIFY(settings1.contains("width"));
|
|
QVERIFY(settings1.contains("height"));
|
|
QVERIFY(!settings1.contains("height/foo/bar/doesn't/exist"));
|
|
|
|
QStringList keys = settings1.allKeys();
|
|
QStringList expectedResult = QStringList() << "x" << "y" << "width" << "height";
|
|
keys.sort();
|
|
expectedResult.sort();
|
|
int i;
|
|
QCOMPARE(keys, expectedResult);
|
|
for (i = 0; i < keys.size(); ++i) {
|
|
QVERIFY(settings1.contains(keys.at(i)));
|
|
}
|
|
|
|
settings1.endGroup();
|
|
QVERIFY(settings1.group() == "alpha");
|
|
keys = settings1.allKeys();
|
|
QCOMPARE(keys.size(), expectedResult.size() + 3);
|
|
for (i = 0; i < keys.size(); ++i) {
|
|
QVERIFY(settings1.contains(keys.at(i)));
|
|
}
|
|
|
|
settings1.endGroup();
|
|
QVERIFY(settings1.group().isEmpty());
|
|
keys = settings1.allKeys();
|
|
|
|
QCOMPARE(keys.size(), initialNumKeys + 7);
|
|
for (i = 0; i < keys.size(); ++i) {
|
|
QVERIFY(settings1.contains(keys.at(i)));
|
|
}
|
|
}
|
|
|
|
void tst_QSettings::sync()
|
|
{
|
|
/*
|
|
What we're trying to test here is the case where two
|
|
instances of the same application access the same preference
|
|
files. We want to make sure that the results are 'merged',
|
|
rather than having the last application overwrite settings
|
|
set by the first application (like in Qt 3).
|
|
|
|
This is only applicable to the INI format. The Windows
|
|
registry and Mac's CFPreferences API should take care of this
|
|
by themselves.
|
|
*/
|
|
|
|
QSettings settings1(QSettings::IniFormat, QSettings::UserScope, "software.org");
|
|
settings1.setValue("alpha/beta/geometry", -7);
|
|
settings1.setValue("alpha/beta/geometry/x", 1);
|
|
settings1.setValue("alpha/beta/geometry/y", 2);
|
|
settings1.setValue("alpha/beta/geometry/width", 3);
|
|
settings1.setValue("alpha/beta/geometry/height", 4);
|
|
settings1.setValue("alpha/gamma/splitter", 5);
|
|
settings1.sync(); // and it all goes into the file
|
|
|
|
QSettings settings2(QSettings::IniFormat, QSettings::UserScope, "other.software.org");
|
|
settings2.setValue("alpha/beta/geometry/x", 8);
|
|
settings2.sync();
|
|
|
|
settings2.setValue("moo/beta/geometry", -7);
|
|
settings2.setValue("moo/beta/geometry/x", 1);
|
|
settings2.setValue("moo/beta/geometry/y", 2);
|
|
settings2.setValue("moo/beta/geometry/width", 3);
|
|
settings2.setValue("moo/beta/geometry/height", 4);
|
|
settings2.setValue("moo/gamma/splitter", 5);
|
|
settings2.setValue("alpha/gamma/splitter", 15);
|
|
settings2.remove("alpha/beta/geometry/x");
|
|
settings2.remove("alpha/beta/geometry/y"); // should do nothing
|
|
|
|
// Now "some other app" will change other.software.org.ini
|
|
QString userConfDir = settingsPath("__user__") + QDir::separator();
|
|
#if !defined(Q_OS_WINCE) && !defined(Q_OS_SYMBIAN)
|
|
unlink((userConfDir + "other.software.org.ini").toLatin1());
|
|
rename((userConfDir + "software.org.ini").toLatin1(),
|
|
(userConfDir + "other.software.org.ini").toLatin1());
|
|
#else
|
|
QFile::remove(userConfDir + "other.software.org.ini");
|
|
QFile::rename(userConfDir + "software.org.ini" , userConfDir + "other.software.org.ini");
|
|
#endif
|
|
|
|
settings2.sync();
|
|
|
|
// And voila, we should be merged
|
|
|
|
QCOMPARE(settings2.value("alpha/beta/geometry").toInt(), -7);
|
|
QVERIFY(!settings2.contains("alpha/beta/geometry/x")); // <----- removed by settings2
|
|
QCOMPARE(settings2.value("alpha/beta/geometry/y").toInt(), 2);
|
|
QCOMPARE(settings2.value("alpha/beta/geometry/width").toInt(), 3);
|
|
QCOMPARE(settings2.value("alpha/beta/geometry/height").toInt(), 4);
|
|
QCOMPARE(settings2.value("alpha/gamma/splitter").toInt(), 15); // <---- set by settings2
|
|
QCOMPARE(settings2.value("moo/beta/geometry").toInt(), -7);
|
|
QCOMPARE(settings2.value("moo/beta/geometry/x").toInt(), 1);
|
|
QCOMPARE(settings2.value("moo/beta/geometry/y").toInt(), 2);
|
|
QCOMPARE(settings2.value("moo/beta/geometry/width").toInt(), 3);
|
|
QCOMPARE(settings2.value("moo/beta/geometry/height").toInt(), 4);
|
|
QCOMPARE(settings2.value("moo/gamma/splitter").toInt(), 5);
|
|
QCOMPARE(settings2.allKeys().count(), 11);
|
|
|
|
// Now, software.org.ini no longer exists, this is same as another app
|
|
// clearing all settings.
|
|
settings1.sync();
|
|
QCOMPARE(settings1.allKeys().count(), 0);
|
|
|
|
/*
|
|
// Now "some other app" will change software.org.conf
|
|
unlink((userConfDir + "software.org.ini").toLatin1());
|
|
rename((userConfDir + "other.software.org.ini").toLatin1(),
|
|
(userConfDir + "software.org.ini").toLatin1());
|
|
|
|
settings1.sync();
|
|
QCOMPARE(settings1.value("alpha/beta/geometry").toInt(), -7);
|
|
QCOMPARE(settings1.value("alpha/beta/geometry/y").toInt(), 2);
|
|
QCOMPARE(settings1.value("alpha/beta/geometry/width").toInt(), 3);
|
|
QCOMPARE(settings1.value("alpha/beta/geometry/height").toInt(), 4);
|
|
QCOMPARE(settings1.value("alpha/gamma/splitter").toInt(), 15);
|
|
QCOMPARE(settings1.value("moo/beta/geometry").toInt(), -7);
|
|
QCOMPARE(settings1.value("moo/beta/geometry/x").toInt(), 1);
|
|
QCOMPARE(settings1.value("moo/beta/geometry/y").toInt(), 2);
|
|
QCOMPARE(settings1.value("moo/beta/geometry/width").toInt(), 3);
|
|
QCOMPARE(settings1.value("moo/beta/geometry/height").toInt(), 4);
|
|
QCOMPARE(settings1.value("moo/gamma/splitter").toInt(), 5);
|
|
QCOMPARE(settings1.allKeys().count(), 11);
|
|
*/
|
|
}
|
|
|
|
void tst_QSettings::setFallbacksEnabled_data()
|
|
{
|
|
populateWithFormats();
|
|
}
|
|
|
|
void tst_QSettings::setFallbacksEnabled()
|
|
{
|
|
QFETCH(QSettings::Format, format);
|
|
|
|
QSettings settings1(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
QSettings settings2(format, QSettings::UserScope, "software.org");
|
|
QSettings settings3(format, QSettings::SystemScope, "software.org", "KillerAPP");
|
|
QSettings settings4(format, QSettings::SystemScope, "software.org");
|
|
|
|
settings1.setValue("key 1", "alpha");
|
|
settings2.setValue("key 1", "beta");
|
|
settings3.setValue("key 1", "gamma");
|
|
settings4.setValue("key 1", "delta");
|
|
|
|
settings1.setValue("key 2", "alpha");
|
|
settings2.setValue("key 2", "beta");
|
|
settings3.setValue("key 2", "gamma");
|
|
|
|
settings1.setValue("key 3", "alpha");
|
|
settings3.setValue("key 3", "gamma");
|
|
settings4.setValue("key 3", "delta");
|
|
|
|
settings1.setValue("key 4", "alpha");
|
|
settings2.setValue("key 4", "beta");
|
|
settings4.setValue("key 4", "delta");
|
|
|
|
settings2.setValue("key 5", "beta");
|
|
settings3.setValue("key 5", "gamma");
|
|
settings4.setValue("key 5", "delta");
|
|
|
|
QVERIFY(settings1.fallbacksEnabled());
|
|
QVERIFY(settings2.fallbacksEnabled());
|
|
QVERIFY(settings3.fallbacksEnabled());
|
|
QVERIFY(settings4.fallbacksEnabled());
|
|
|
|
settings1.setFallbacksEnabled(false);
|
|
settings2.setFallbacksEnabled(false);
|
|
settings3.setFallbacksEnabled(false);
|
|
settings4.setFallbacksEnabled(false);
|
|
|
|
QVERIFY(!settings1.fallbacksEnabled());
|
|
QVERIFY(!settings2.fallbacksEnabled());
|
|
QVERIFY(!settings3.fallbacksEnabled());
|
|
QVERIFY(!settings4.fallbacksEnabled());
|
|
|
|
/*
|
|
Make sure that the QSettings objects can still access their
|
|
main associated file when fallbacks are turned off.
|
|
*/
|
|
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("alpha"));
|
|
QCOMPARE(settings2.value("key 1").toString(), QString("beta"));
|
|
QCOMPARE(settings3.value("key 1").toString(), QString("gamma"));
|
|
QCOMPARE(settings4.value("key 1").toString(), QString("delta"));
|
|
|
|
QCOMPARE(settings1.value("key 2").toString(), QString("alpha"));
|
|
QCOMPARE(settings2.value("key 2").toString(), QString("beta"));
|
|
QCOMPARE(settings3.value("key 2").toString(), QString("gamma"));
|
|
QVERIFY(!settings4.contains("key 2"));
|
|
|
|
QCOMPARE(settings1.value("key 3").toString(), QString("alpha"));
|
|
QCOMPARE(settings3.value("key 3").toString(), QString("gamma"));
|
|
QCOMPARE(settings4.value("key 3").toString(), QString("delta"));
|
|
QVERIFY(!settings2.contains("key 3"));
|
|
|
|
QCOMPARE(settings1.value("key 4").toString(), QString("alpha"));
|
|
QCOMPARE(settings2.value("key 4").toString(), QString("beta"));
|
|
QCOMPARE(settings4.value("key 4").toString(), QString("delta"));
|
|
QVERIFY(!settings3.contains("key 4"));
|
|
|
|
QCOMPARE(settings2.value("key 5").toString(), QString("beta"));
|
|
QCOMPARE(settings3.value("key 5").toString(), QString("gamma"));
|
|
QCOMPARE(settings4.value("key 5").toString(), QString("delta"));
|
|
QVERIFY(!settings1.contains("key 5"));
|
|
|
|
QCOMPARE(settings1.value("key 1").toString(), QString("alpha"));
|
|
QCOMPARE(settings1.value("key 5").toString(), QString(""));
|
|
QVERIFY(settings1.contains("key 1"));
|
|
QVERIFY(!settings1.contains("key 5"));
|
|
}
|
|
|
|
void tst_QSettings::testChildKeysAndGroups_data()
|
|
{
|
|
populateWithFormats();
|
|
}
|
|
|
|
void tst_QSettings::testChildKeysAndGroups()
|
|
{
|
|
QFETCH(QSettings::Format, format);
|
|
|
|
QSettings settings1(format, QSettings::UserScope, "software.org");
|
|
settings1.setFallbacksEnabled(false);
|
|
settings1.setValue("alpha/beta/geometry", -7);
|
|
settings1.setValue("alpha/beta/geometry/x", 1);
|
|
settings1.setValue("alpha/beta/geometry/y", 2);
|
|
settings1.setValue("alpha/beta/geometry/width", 3);
|
|
settings1.setValue("alpha/beta/geometry/height", 4);
|
|
settings1.setValue("alpha/gamma/splitter", 5);
|
|
|
|
QCOMPARE(settings1.childKeys(), QStringList());
|
|
QCOMPARE(settings1.childGroups(), QStringList() << "alpha");
|
|
|
|
settings1.beginGroup("/alpha");
|
|
QCOMPARE(settings1.childKeys(), QStringList());
|
|
QCOMPARE(settings1.childGroups(), QStringList() << "beta" << "gamma");
|
|
|
|
settings1.beginGroup("/beta");
|
|
QCOMPARE(settings1.childKeys(), QStringList() << "geometry");
|
|
QCOMPARE(settings1.childGroups(), QStringList() << "geometry");
|
|
|
|
settings1.beginGroup("/geometry");
|
|
QCOMPARE(settings1.childKeys(), QStringList() << "height" << "width" << "x" << "y");
|
|
QCOMPARE(settings1.childGroups(), QStringList());
|
|
|
|
settings1.beginGroup("/width");
|
|
QCOMPARE(settings1.childKeys(), QStringList());
|
|
QCOMPARE(settings1.childGroups(), QStringList());
|
|
|
|
settings1.endGroup();
|
|
settings1.endGroup();
|
|
settings1.endGroup();
|
|
settings1.endGroup();
|
|
|
|
{ // task 53792
|
|
QSettings settings2("other.software.org");
|
|
settings2.setValue("viewbar/foo/test1", "1");
|
|
settings2.setValue("viewbar/foo/test2", "2");
|
|
settings2.setValue("viewbar/foo/test3", "3");
|
|
settings2.setValue("viewbar/foo/test4", "4");
|
|
settings2.setValue("viewbar/foo/test5", "5");
|
|
settings2.setValue("viewbar/bar/test1", "1");
|
|
settings2.setValue("viewbar/bar/test2", "2");
|
|
settings2.setValue("viewbar/bar/test3", "3");
|
|
settings2.setValue("viewbar/bar/test4", "4");
|
|
settings2.setValue("viewbar/bar/test5", "5");
|
|
|
|
settings2.beginGroup("viewbar");
|
|
QStringList l = settings2.childGroups();
|
|
settings2.endGroup();
|
|
l.sort();
|
|
QCOMPARE(l, QStringList() << "bar" << "foo");
|
|
}
|
|
}
|
|
|
|
void tst_QSettings::testUpdateRequestEvent()
|
|
{
|
|
QFile::remove("foo");
|
|
QVERIFY(!QFile::exists("foo"));
|
|
|
|
QSettings settings1("foo", QSettings::IniFormat);
|
|
QVERIFY(!QFile::exists("foo"));
|
|
QVERIFY(QFileInfo("foo").size() == 0);
|
|
settings1.setValue("key1", 1);
|
|
QVERIFY(QFileInfo("foo").size() == 0);
|
|
|
|
QTRY_VERIFY(QFileInfo("foo").size() > 0);
|
|
|
|
settings1.remove("key1");
|
|
QVERIFY(QFileInfo("foo").size() > 0);
|
|
|
|
QTRY_VERIFY(QFileInfo("foo").size() == 0);
|
|
|
|
settings1.setValue("key2", 2);
|
|
QVERIFY(QFileInfo("foo").size() == 0);
|
|
|
|
QTRY_VERIFY(QFileInfo("foo").size() > 0);
|
|
|
|
settings1.clear();
|
|
QVERIFY(QFileInfo("foo").size() > 0);
|
|
|
|
QTRY_VERIFY(QFileInfo("foo").size() == 0);
|
|
}
|
|
|
|
const int NumIterations = 5;
|
|
const int NumThreads = 4;
|
|
|
|
class SettingsThread : public QThread
|
|
{
|
|
public:
|
|
void run();
|
|
void start(int n) { param = n; QThread::start(); }
|
|
|
|
private:
|
|
int param;
|
|
};
|
|
|
|
void SettingsThread::run()
|
|
{
|
|
for (int i = 0; i < NumIterations; ++i) {
|
|
QSettings settings("software.org", "KillerAPP");
|
|
settings.setValue(QString::number((param * NumIterations) + i), param);
|
|
settings.sync();
|
|
QCOMPARE((int)settings.status(), (int)QSettings::NoError);
|
|
}
|
|
}
|
|
|
|
void tst_QSettings::testThreadSafety()
|
|
{
|
|
SettingsThread threads[NumThreads];
|
|
int i, j;
|
|
|
|
for (i = 0; i < NumThreads; ++i)
|
|
threads[i].start(i + 1);
|
|
for (i = 0; i < NumThreads; ++i)
|
|
threads[i].wait();
|
|
|
|
QSettings settings("software.org", "KillerAPP");
|
|
for (i = 0; i < NumThreads; ++i) {
|
|
int param = i + 1;
|
|
for (j = 0; j < NumIterations; ++j) {
|
|
QCOMPARE(settings.value(QString::number((param * NumIterations) + j)).toInt(), param);
|
|
}
|
|
}
|
|
}
|
|
|
|
void tst_QSettings::testNormalizedKey_data()
|
|
{
|
|
QTest::addColumn<QString>("inKey");
|
|
QTest::addColumn<QString>("outKey");
|
|
|
|
QTest::newRow("empty1") << "" << "";
|
|
QTest::newRow("empty2") << "/" << "";
|
|
QTest::newRow("empty3") << "//" << "";
|
|
QTest::newRow("empty4") << "///" << "";
|
|
|
|
QTest::newRow("a1") << "a" << "a";
|
|
QTest::newRow("a2") << "/a" << "a";
|
|
QTest::newRow("a3") << "a/" << "a";
|
|
QTest::newRow("a4") << "//a" << "a";
|
|
QTest::newRow("a5") << "a//" << "a";
|
|
QTest::newRow("a6") << "///a" << "a";
|
|
QTest::newRow("a7") << "a///" << "a";
|
|
QTest::newRow("a8") << "///a/" << "a";
|
|
QTest::newRow("a9") << "/a///" << "a";
|
|
|
|
QTest::newRow("ab1") << "aaa/bbb" << "aaa/bbb";
|
|
QTest::newRow("ab2") << "/aaa/bbb" << "aaa/bbb";
|
|
QTest::newRow("ab3") << "aaa/bbb/" << "aaa/bbb";
|
|
QTest::newRow("ab4") << "/aaa/bbb/" << "aaa/bbb";
|
|
QTest::newRow("ab5") << "aaa///bbb" << "aaa/bbb";
|
|
QTest::newRow("ab6") << "aaa///bbb/" << "aaa/bbb";
|
|
QTest::newRow("ab7") << "/aaa///bbb/" << "aaa/bbb";
|
|
QTest::newRow("ab8") << "////aaa///bbb////" << "aaa/bbb";
|
|
}
|
|
|
|
void tst_QSettings::testNormalizedKey()
|
|
{
|
|
#ifdef QT_BUILD_INTERNAL
|
|
QFETCH(QString, inKey);
|
|
QFETCH(QString, outKey);
|
|
|
|
inKey.detach();
|
|
|
|
QString result = QSettingsPrivate::normalizedKey(inKey);
|
|
QCOMPARE(result, outKey);
|
|
|
|
/*
|
|
If the key is already normalized, we verify that outKey is
|
|
just a shallow copy of the input string. This is an important
|
|
optimization that shouldn't be removed accidentally.
|
|
*/
|
|
if (inKey == outKey) {
|
|
QVERIFY(!result.isDetached());
|
|
} else {
|
|
if (!result.isEmpty()) {
|
|
QVERIFY(result.isDetached());
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void tst_QSettings::testEmptyData()
|
|
{
|
|
QString filename(QDir::tempPath() + "/empty.ini");
|
|
QFile::remove(filename);
|
|
QVERIFY(!QFile::exists(filename));
|
|
|
|
QString nullString;
|
|
QString emptyString("");
|
|
QStringList emptyList;
|
|
QStringList list;
|
|
QStringList list2;
|
|
|
|
QVariantList emptyVList;
|
|
QVariantList vList, vList2, vList3;
|
|
|
|
list << emptyString << nullString;
|
|
list2 << emptyString;
|
|
vList << emptyString;
|
|
vList2 << emptyString << nullString;
|
|
vList3 << QString("foo");
|
|
|
|
{
|
|
QSettings settings(filename, QSettings::IniFormat);
|
|
settings.setValue("nullString", nullString);
|
|
settings.setValue("emptyString", emptyString);
|
|
settings.setValue("emptyList", emptyList);
|
|
settings.setValue("list", list);
|
|
settings.setValue("list2", list2);
|
|
settings.setValue("emptyVList", emptyVList);
|
|
settings.setValue("vList", vList);
|
|
settings.setValue("vList2", vList2);
|
|
settings.setValue("vList3", vList3);
|
|
QVERIFY(settings.status() == QSettings::NoError);
|
|
}
|
|
{
|
|
QSettings settings(filename, QSettings::IniFormat);
|
|
QCOMPARE(settings.value("nullString").toString(), nullString);
|
|
QCOMPARE(settings.value("emptyString").toString(), emptyString);
|
|
QCOMPARE(settings.value("emptyList").toStringList(), emptyList);
|
|
QCOMPARE(settings.value("list").toStringList(), list);
|
|
QCOMPARE(settings.value("list2").toStringList(), list2);
|
|
QCOMPARE(settings.value("emptyVList").toList(), emptyVList);
|
|
QCOMPARE(settings.value("vList").toList(), vList);
|
|
QCOMPARE(settings.value("vList2").toList(), vList2);
|
|
QCOMPARE(settings.value("vList3").toList(), vList3);
|
|
QVERIFY(settings.status() == QSettings::NoError);
|
|
}
|
|
|
|
{
|
|
QSettings settings("Trolltech", "tst_qsettings");
|
|
settings.setValue("nullString", nullString);
|
|
settings.setValue("emptyString", emptyString);
|
|
settings.setValue("emptyList", emptyList);
|
|
settings.setValue("list", list);
|
|
settings.setValue("list2", list2);
|
|
settings.setValue("emptyVList", emptyVList);
|
|
settings.setValue("vList", vList);
|
|
settings.setValue("vList2", vList2);
|
|
settings.setValue("vList3", vList3);
|
|
QVERIFY(settings.status() == QSettings::NoError);
|
|
}
|
|
{
|
|
QSettings settings("Trolltech", "tst_qsettings");
|
|
QCOMPARE(settings.value("nullString").toString(), nullString);
|
|
QCOMPARE(settings.value("emptyString").toString(), emptyString);
|
|
QCOMPARE(settings.value("emptyList").toStringList(), emptyList);
|
|
QCOMPARE(settings.value("list").toStringList(), list);
|
|
QCOMPARE(settings.value("list2").toStringList(), list2);
|
|
QCOMPARE(settings.value("emptyVList").toList(), emptyVList);
|
|
QCOMPARE(settings.value("vList").toList(), vList);
|
|
QCOMPARE(settings.value("vList2").toList(), vList2);
|
|
QCOMPARE(settings.value("vList3").toList(), vList3);
|
|
QVERIFY(settings.status() == QSettings::NoError);
|
|
}
|
|
QFile::remove(filename);
|
|
}
|
|
|
|
void tst_QSettings::testResourceFiles()
|
|
{
|
|
QSettings settings(":/resourcefile.ini", QSettings::IniFormat);
|
|
QVERIFY(settings.status() == QSettings::NoError);
|
|
QVERIFY(!settings.isWritable());
|
|
QCOMPARE(settings.value("Field 1/Bottom").toInt(), 89);
|
|
settings.setValue("Field 1/Bottom", 90);
|
|
|
|
// the next two lines check the statu quo; another behavior would be possible
|
|
QVERIFY(settings.status() == QSettings::NoError);
|
|
QCOMPARE(settings.value("Field 1/Bottom").toInt(), 90);
|
|
|
|
settings.sync();
|
|
QVERIFY(settings.status() == QSettings::AccessError);
|
|
QCOMPARE(settings.value("Field 1/Bottom").toInt(), 90);
|
|
}
|
|
|
|
void tst_QSettings::fromFile_data()
|
|
{
|
|
populateWithFormats();
|
|
}
|
|
|
|
void tst_QSettings::fromFile()
|
|
{
|
|
QFETCH(QSettings::Format, format);
|
|
|
|
QFile::remove("foo");
|
|
QVERIFY(!QFile::exists("foo"));
|
|
|
|
QString path = "foo";
|
|
|
|
#ifdef Q_OS_WIN
|
|
if (format == QSettings::NativeFormat)
|
|
path = "\\HKEY_CURRENT_USER\\Software\\foo";
|
|
#endif
|
|
|
|
QStringList strList = QStringList() << "hope" << "destiny" << "chastity";
|
|
|
|
{
|
|
QSettings settings1(path, format);
|
|
QVERIFY(settings1.allKeys().isEmpty());
|
|
|
|
settings1.setValue("alpha", 1);
|
|
settings1.setValue("alpha", 2);
|
|
settings1.setValue("beta", strList);
|
|
|
|
QSettings settings2(path, format);
|
|
QCOMPARE(settings2.value("alpha").toInt(), 2);
|
|
|
|
settings1.sync();
|
|
#ifndef Q_OS_WIN
|
|
QVERIFY(QFile::exists("foo"));
|
|
#endif
|
|
QCOMPARE(settings1.value("alpha").toInt(), 2);
|
|
QCOMPARE(settings2.value("alpha").toInt(), 2);
|
|
|
|
settings2.setValue("alpha", 3);
|
|
settings2.setValue("gamma/foo.bar", 4);
|
|
QCOMPARE(settings1.value("alpha").toInt(), 3);
|
|
QCOMPARE(settings2.value("alpha").toInt(), 3);
|
|
QCOMPARE(settings1.value("beta").toStringList(), strList);
|
|
QCOMPARE(settings2.value("beta").toStringList(), strList);
|
|
QCOMPARE(settings1.value("gamma/foo.bar").toInt(), 4);
|
|
QCOMPARE(settings2.value("gamma/foo.bar").toInt(), 4);
|
|
}
|
|
|
|
{
|
|
QSettings settings1(path, format);
|
|
QCOMPARE(settings1.value("alpha").toInt(), 3);
|
|
QCOMPARE(settings1.value("beta").toStringList(), strList);
|
|
QCOMPARE(settings1.value("gamma/foo.bar").toInt(), 4);
|
|
QCOMPARE(settings1.allKeys().size(), 3);
|
|
}
|
|
}
|
|
|
|
void tst_QSettings::setIniCodec()
|
|
{
|
|
#ifdef QT_BUILD_INTERNAL
|
|
QByteArray expeContents4, expeContents5;
|
|
QByteArray actualContents4, actualContents5;
|
|
|
|
{
|
|
QFile inFile(":/resourcefile4.ini");
|
|
inFile.open(QIODevice::ReadOnly);
|
|
expeContents4 = inFile.readAll();
|
|
inFile.close();
|
|
}
|
|
|
|
{
|
|
QFile inFile(":/resourcefile5.ini");
|
|
inFile.open(QIODevice::ReadOnly);
|
|
expeContents5 = inFile.readAll();
|
|
inFile.close();
|
|
}
|
|
|
|
{
|
|
QSettings settings4(QSettings::IniFormat, QSettings::UserScope, "software.org", "KillerAPP");
|
|
settings4.setIniCodec("UTF-8");
|
|
settings4.setValue(QLatin1String("Fa\xe7" "ade/QU\xc9" "BEC"), QLatin1String("Fa\xe7" "ade/QU\xc9" "BEC"));
|
|
settings4.sync();
|
|
|
|
QSettings settings5(QSettings::IniFormat, QSettings::UserScope, "other.software.org", "KillerAPP");
|
|
settings5.setIniCodec("ISO 8859-1");
|
|
settings5.setValue(QLatin1String("Fa\xe7" "ade/QU\xc9" "BEC"), QLatin1String("Fa\xe7" "ade/QU\xc9" "BEC"));
|
|
settings5.sync();
|
|
|
|
{
|
|
QFile inFile(settings4.fileName());
|
|
inFile.open(QIODevice::ReadOnly);
|
|
actualContents4 = inFile.readAll();
|
|
inFile.close();
|
|
}
|
|
|
|
{
|
|
QFile inFile(settings5.fileName());
|
|
inFile.open(QIODevice::ReadOnly);
|
|
actualContents5 = inFile.readAll();
|
|
inFile.close();
|
|
}
|
|
}
|
|
|
|
QConfFile::clearCache();
|
|
|
|
QCOMPARE(actualContents4, expeContents4);
|
|
QCOMPARE(actualContents5, expeContents5);
|
|
|
|
QSettings settings4(QSettings::IniFormat, QSettings::UserScope, "software.org", "KillerAPP");
|
|
settings4.setIniCodec("UTF-8");
|
|
QSettings settings5(QSettings::IniFormat, QSettings::UserScope, "other.software.org", "KillerAPP");
|
|
settings5.setIniCodec("Latin-1");
|
|
|
|
QCOMPARE(settings4.allKeys().count(), 1);
|
|
QCOMPARE(settings5.allKeys().count(), 1);
|
|
|
|
QCOMPARE(settings4.allKeys().first(), settings5.allKeys().first());
|
|
QCOMPARE(settings4.value(settings4.allKeys().first()).toString(),
|
|
settings5.value(settings5.allKeys().first()).toString());
|
|
#endif
|
|
}
|
|
|
|
static bool containsSubList(QStringList mom, QStringList son)
|
|
{
|
|
for (int i = 0; i < son.size(); ++i) {
|
|
if (!mom.contains(son.at(i)))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void tst_QSettings::testArrays_data()
|
|
{
|
|
populateWithFormats();
|
|
}
|
|
|
|
/*
|
|
Tests beginReadArray(), beginWriteArray(), endArray(), and
|
|
setArrayIndex().
|
|
*/
|
|
void tst_QSettings::testArrays()
|
|
{
|
|
QFETCH(QSettings::Format, format);
|
|
|
|
{
|
|
QSettings settings1(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
|
|
settings1.beginWriteArray("foo/bar", 3);
|
|
settings1.setValue("bip", 1);
|
|
settings1.setArrayIndex(0);
|
|
settings1.setValue("ene", 2);
|
|
settings1.setValue("due", 3);
|
|
settings1.setValue("rike", 4);
|
|
settings1.setArrayIndex(1);
|
|
settings1.setValue("ene", 5);
|
|
settings1.setValue("due", 6);
|
|
settings1.setValue("rike", 7);
|
|
settings1.setArrayIndex(2);
|
|
settings1.setValue("ene", 8);
|
|
settings1.setValue("due", 9);
|
|
settings1.setValue("rike", 10);
|
|
settings1.endArray();
|
|
|
|
QStringList expectedList;
|
|
expectedList
|
|
<< "foo/bar/bip"
|
|
<< "foo/bar/size"
|
|
<< "foo/bar/1/ene"
|
|
<< "foo/bar/1/due"
|
|
<< "foo/bar/1/rike"
|
|
<< "foo/bar/2/ene"
|
|
<< "foo/bar/2/due"
|
|
<< "foo/bar/2/rike"
|
|
<< "foo/bar/3/ene"
|
|
<< "foo/bar/3/due"
|
|
<< "foo/bar/3/rike";
|
|
expectedList.sort();
|
|
|
|
QStringList actualList = settings1.allKeys();
|
|
actualList.sort();
|
|
QVERIFY(containsSubList(actualList, expectedList));
|
|
|
|
QCOMPARE(settings1.value("/foo/bar/bip").toInt(), 1);
|
|
QCOMPARE(settings1.value("/foo/bar/1/ene").toInt(), 2);
|
|
QCOMPARE(settings1.value("/foo/bar/1/due").toInt(), 3);
|
|
QCOMPARE(settings1.value("/foo/bar/1/rike").toInt(), 4);
|
|
QCOMPARE(settings1.value("/foo/bar/2/ene").toInt(), 5);
|
|
QCOMPARE(settings1.value("/foo/bar/2/due").toInt(), 6);
|
|
QCOMPARE(settings1.value("/foo/bar/2/rike").toInt(), 7);
|
|
QCOMPARE(settings1.value("/foo/bar/3/ene").toInt(), 8);
|
|
QCOMPARE(settings1.value("/foo/bar/3/due").toInt(), 9);
|
|
QCOMPARE(settings1.value("/foo/bar/3/rike").toInt(), 10);
|
|
|
|
settings1.beginGroup("/foo");
|
|
int count = settings1.beginReadArray("bar");
|
|
QCOMPARE(count, 3);
|
|
QCOMPARE(settings1.value("bip").toInt(), 1);
|
|
settings1.setArrayIndex(0);
|
|
QCOMPARE(settings1.value("ene").toInt(), 2);
|
|
QCOMPARE(settings1.value("due").toInt(), 3);
|
|
QCOMPARE(settings1.value("rike").toInt(), 4);
|
|
QCOMPARE(settings1.allKeys().count(), 3);
|
|
settings1.setArrayIndex(1);
|
|
QCOMPARE(settings1.value("ene").toInt(), 5);
|
|
QCOMPARE(settings1.value("due").toInt(), 6);
|
|
QCOMPARE(settings1.value("rike").toInt(), 7);
|
|
QCOMPARE(settings1.allKeys().count(), 3);
|
|
settings1.setArrayIndex(2);
|
|
QCOMPARE(settings1.value("ene").toInt(), 8);
|
|
QCOMPARE(settings1.value("due").toInt(), 9);
|
|
QCOMPARE(settings1.value("rike").toInt(), 10);
|
|
QCOMPARE(settings1.allKeys().count(), 3);
|
|
|
|
settings1.endArray();
|
|
settings1.endGroup();
|
|
}
|
|
/*
|
|
Check that we get the arrays right when we load them again
|
|
*/
|
|
|
|
{
|
|
QSettings settings1(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
|
|
QStringList expectedList;
|
|
expectedList
|
|
<< "foo/bar/bip"
|
|
<< "foo/bar/size"
|
|
<< "foo/bar/1/ene"
|
|
<< "foo/bar/1/due"
|
|
<< "foo/bar/1/rike"
|
|
<< "foo/bar/2/ene"
|
|
<< "foo/bar/2/due"
|
|
<< "foo/bar/2/rike"
|
|
<< "foo/bar/3/ene"
|
|
<< "foo/bar/3/due"
|
|
<< "foo/bar/3/rike";
|
|
expectedList.sort();
|
|
|
|
QStringList actualList = settings1.allKeys();
|
|
actualList.sort();
|
|
QVERIFY(containsSubList(actualList, expectedList));
|
|
|
|
QCOMPARE(settings1.value("/foo/bar/bip").toInt(), 1);
|
|
QCOMPARE(settings1.value("/foo/bar/1/ene").toInt(), 2);
|
|
QCOMPARE(settings1.value("/foo/bar/1/due").toInt(), 3);
|
|
QCOMPARE(settings1.value("/foo/bar/1/rike").toInt(), 4);
|
|
QCOMPARE(settings1.value("/foo/bar/2/ene").toInt(), 5);
|
|
QCOMPARE(settings1.value("/foo/bar/2/due").toInt(), 6);
|
|
QCOMPARE(settings1.value("/foo/bar/2/rike").toInt(), 7);
|
|
QCOMPARE(settings1.value("/foo/bar/3/ene").toInt(), 8);
|
|
QCOMPARE(settings1.value("/foo/bar/3/due").toInt(), 9);
|
|
QCOMPARE(settings1.value("/foo/bar/3/rike").toInt(), 10);
|
|
|
|
settings1.beginGroup("/foo");
|
|
int count = settings1.beginReadArray("bar");
|
|
QCOMPARE(count, 3);
|
|
QCOMPARE(settings1.value("bip").toInt(), 1);
|
|
settings1.setArrayIndex(0);
|
|
QCOMPARE(settings1.value("ene").toInt(), 2);
|
|
QCOMPARE(settings1.value("due").toInt(), 3);
|
|
QCOMPARE(settings1.value("rike").toInt(), 4);
|
|
QCOMPARE(settings1.allKeys().count(), 3);
|
|
settings1.setArrayIndex(1);
|
|
QCOMPARE(settings1.value("ene").toInt(), 5);
|
|
QCOMPARE(settings1.value("due").toInt(), 6);
|
|
QCOMPARE(settings1.value("rike").toInt(), 7);
|
|
QCOMPARE(settings1.allKeys().count(), 3);
|
|
settings1.setArrayIndex(2);
|
|
QCOMPARE(settings1.value("ene").toInt(), 8);
|
|
QCOMPARE(settings1.value("due").toInt(), 9);
|
|
QCOMPARE(settings1.value("rike").toInt(), 10);
|
|
QCOMPARE(settings1.allKeys().count(), 3);
|
|
|
|
settings1.endArray();
|
|
settings1.endGroup();
|
|
}
|
|
/*
|
|
This code generates lots of warnings, but that's on purpose.
|
|
Basically, we check that endGroup() can be used instead of
|
|
endArray() and vice versa. This is not documented, but this
|
|
is the behavior that we have chosen.
|
|
*/
|
|
QSettings settings1(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
settings1.clear();
|
|
settings1.beginGroup("/alpha");
|
|
QCOMPARE(settings1.group(), QString("alpha"));
|
|
settings1.setArrayIndex(0);
|
|
QCOMPARE(settings1.group(), QString("alpha"));
|
|
settings1.setArrayIndex(1);
|
|
QCOMPARE(settings1.group(), QString("alpha"));
|
|
settings1.setArrayIndex(2);
|
|
QCOMPARE(settings1.group(), QString("alpha"));
|
|
settings1.beginGroup("/beta");
|
|
QCOMPARE(settings1.group(), QString("alpha/beta"));
|
|
settings1.beginGroup("");
|
|
QCOMPARE(settings1.group(), QString("alpha/beta"));
|
|
settings1.beginWriteArray("DO", 4);
|
|
QCOMPARE(settings1.value("size").toInt(), 4);
|
|
QCOMPARE(settings1.group(), QString("alpha/beta/DO"));
|
|
settings1.setArrayIndex(0);
|
|
QCOMPARE(settings1.group(), QString("alpha/beta/DO/1"));
|
|
settings1.setArrayIndex(1);
|
|
QCOMPARE(settings1.group(), QString("alpha/beta/DO/2"));
|
|
settings1.beginGroup("1");
|
|
QCOMPARE(settings1.group(), QString("alpha/beta/DO/2/1"));
|
|
settings1.setArrayIndex(3);
|
|
QCOMPARE(settings1.group(), QString("alpha/beta/DO/2/1"));
|
|
settings1.setArrayIndex(4);
|
|
QCOMPARE(settings1.group(), QString("alpha/beta/DO/2/1"));
|
|
settings1.beginWriteArray("RE");
|
|
QVERIFY(!settings1.contains("size"));
|
|
QCOMPARE(settings1.group(), QString("alpha/beta/DO/2/1/RE"));
|
|
settings1.setArrayIndex(0);
|
|
QCOMPARE(settings1.group(), QString("alpha/beta/DO/2/1/RE/1"));
|
|
settings1.setArrayIndex(1);
|
|
QCOMPARE(settings1.group(), QString("alpha/beta/DO/2/1/RE/2"));
|
|
settings1.endArray();
|
|
QCOMPARE(settings1.group(), QString("alpha/beta/DO/2/1"));
|
|
settings1.endArray();
|
|
QCOMPARE(settings1.group(), QString("alpha/beta/DO/2"));
|
|
settings1.setArrayIndex(2);
|
|
QCOMPARE(settings1.group(), QString("alpha/beta/DO/3"));
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString("alpha/beta"));
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString("alpha/beta"));
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString("alpha"));
|
|
settings1.endArray();
|
|
QCOMPARE(settings1.group(), QString());
|
|
settings1.endGroup();
|
|
QCOMPARE(settings1.group(), QString());
|
|
|
|
/*
|
|
Now, let's make sure that things work well if an array
|
|
is spread across multiple files.
|
|
*/
|
|
int i;
|
|
|
|
settings1.clear();
|
|
QSettings settings2(format, QSettings::UserScope, "software.org");
|
|
|
|
QStringList threeStrings;
|
|
threeStrings << "Uno" << "Dos" << "Tres";
|
|
|
|
QStringList fiveStrings;
|
|
fiveStrings << "alpha" << "beta" << "gamma" << "delta" << "epsilon";
|
|
|
|
settings1.beginWriteArray("strings");
|
|
for (i = threeStrings.size() - 1; i >= 0; --i) {
|
|
settings1.setArrayIndex(i);
|
|
settings1.setValue("fileName", threeStrings.at(i));
|
|
}
|
|
settings1.endArray();
|
|
|
|
settings2.beginWriteArray("strings");
|
|
for (i = fiveStrings.size() - 1; i >= 0; --i) {
|
|
settings2.setArrayIndex(i);
|
|
settings2.setValue("fileName", fiveStrings.at(i));
|
|
}
|
|
settings2.endArray();
|
|
|
|
int size1 = settings1.beginReadArray("strings");
|
|
QCOMPARE(size1, 3);
|
|
QCOMPARE(settings1.value("size").toInt(), 3);
|
|
|
|
for (i = 0; i < size1; ++i) {
|
|
settings1.setArrayIndex(i);
|
|
QString str = settings1.value("fileName").toString();
|
|
QCOMPARE(str, threeStrings.at(i));
|
|
}
|
|
settings1.endArray();
|
|
|
|
int size2 = settings2.beginReadArray("strings");
|
|
QCOMPARE(size2, 5);
|
|
QCOMPARE(settings2.value("size").toInt(), 5);
|
|
|
|
for (i = 0; i < size2; ++i) {
|
|
settings2.setArrayIndex(i);
|
|
QString str = settings2.value("fileName").toString();
|
|
QCOMPARE(str, fiveStrings.at(i));
|
|
}
|
|
settings2.endArray();
|
|
|
|
size1 = settings1.beginReadArray("strings");
|
|
QCOMPARE(size1, 3);
|
|
|
|
// accessing entries beyond the end of settings1 goes to settings2
|
|
for (i = size1; i < size2; ++i) {
|
|
settings1.setArrayIndex(i);
|
|
QString str = settings1.value("fileName").toString();
|
|
QCOMPARE(str, fiveStrings.at(i));
|
|
}
|
|
settings1.endArray();
|
|
}
|
|
|
|
#ifdef QT_BUILD_INTERNAL
|
|
static QByteArray iniEscapedKey(const QString &str)
|
|
{
|
|
QByteArray result;
|
|
QSettingsPrivate::iniEscapedKey(str, result);
|
|
return result;
|
|
}
|
|
|
|
static QString iniUnescapedKey(const QByteArray &ba)
|
|
{
|
|
QString result;
|
|
QSettingsPrivate::iniUnescapedKey(ba, 0, ba.size(), result);
|
|
return result;
|
|
}
|
|
|
|
static QByteArray iniEscapedStringList(const QStringList &strList)
|
|
{
|
|
QByteArray result;
|
|
QSettingsPrivate::iniEscapedStringList(strList, result, 0);
|
|
return result;
|
|
}
|
|
|
|
static QStringList iniUnescapedStringList(const QByteArray &ba)
|
|
{
|
|
QStringList result;
|
|
QString str;
|
|
#if QSETTINGS_P_H_VERSION >= 2
|
|
bool isStringList = QSettingsPrivate::iniUnescapedStringList(ba, 0, ba.size(), str, result
|
|
#if QSETTINGS_P_H_VERSION >= 3
|
|
, 0
|
|
#endif
|
|
);
|
|
if (!isStringList)
|
|
result = QStringList(str);
|
|
#else
|
|
QStringList *strList = QSettingsPrivate::iniUnescapedStringList(ba, 0, ba.size(), str);
|
|
if (strList) {
|
|
result = *strList;
|
|
delete strList;
|
|
} else {
|
|
result = QStringList(str);
|
|
}
|
|
#endif
|
|
return result;
|
|
}
|
|
#endif
|
|
|
|
QString escapeWeirdChars(const QString &s)
|
|
{
|
|
QString result;
|
|
bool escapeNextDigit = false;
|
|
|
|
for (int i = 0; i < s.length(); ++i) {
|
|
QChar c = s.at(i);
|
|
if (c.unicode() < ' ' || c.unicode() > '~'
|
|
|| (escapeNextDigit && c.unicode() >= '0' && c.unicode() <= 'f')) {
|
|
result += QString("\\x%1").arg(c.unicode(), 0, 16);
|
|
escapeNextDigit = true;
|
|
} else {
|
|
result += c;
|
|
escapeNextDigit = false;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
void tst_QSettings::testEscapes()
|
|
{
|
|
#ifdef QT_BUILD_INTERNAL
|
|
QSettings settings(QSettings::UserScope, "software.org", "KillerAPP");
|
|
|
|
#define testEscapedKey(plainKey, escKey) \
|
|
QCOMPARE(iniEscapedKey(plainKey), QByteArray(escKey)); \
|
|
QCOMPARE(iniUnescapedKey(escKey), QString(plainKey));
|
|
|
|
#define testUnescapedKey(escKey, plainKey, reescKey) \
|
|
QCOMPARE(iniUnescapedKey(escKey), QString(plainKey)); \
|
|
QCOMPARE(iniEscapedKey(plainKey), QByteArray(reescKey)); \
|
|
QCOMPARE(iniUnescapedKey(reescKey), QString(plainKey));
|
|
|
|
#define testEscapedStringList(plainStrList, escStrList) \
|
|
{ \
|
|
QStringList plainList(plainStrList); \
|
|
QByteArray escList(escStrList); \
|
|
QCOMPARE(iniEscapedStringList(plainList), escList); \
|
|
QCOMPARE(iniUnescapedStringList(escList), plainList); \
|
|
} \
|
|
|
|
|
|
#define testUnescapedStringList(escStrList, plainStrList, reescStrList) \
|
|
{ \
|
|
QStringList plainList(plainStrList); \
|
|
QByteArray escList(escStrList); \
|
|
QByteArray reescList(reescStrList); \
|
|
QCOMPARE(iniUnescapedStringList(escList), plainList); \
|
|
QCOMPARE(iniEscapedStringList(plainList), reescList); \
|
|
QCOMPARE(iniUnescapedStringList(reescList), plainList); \
|
|
} \
|
|
|
|
|
|
#define testVariant(val, escStr, func) \
|
|
{ \
|
|
QVariant v(val); \
|
|
QString s = QSettingsPrivate::variantToString(v); \
|
|
/*qDebug() << QString("testVariant(): reference=\"%1\" result=\"%2\"").arg(escStr).arg(s); */\
|
|
QCOMPARE(s, escStr); \
|
|
QCOMPARE(QVariant(QSettingsPrivate::stringToVariant(escStr)), v); \
|
|
QVERIFY(val == v.func()); \
|
|
}
|
|
|
|
#define testBadEscape(escStr, vStr) \
|
|
{ \
|
|
QVariant v = QSettingsPrivate::stringToVariant(QString(escStr)); \
|
|
QCOMPARE(v.toString(), QString(vStr)); \
|
|
}
|
|
|
|
testEscapedKey("", "");
|
|
testEscapedKey(" ", "%20");
|
|
testEscapedKey(" 0123 abcd ", "%200123%20abcd%20");
|
|
testEscapedKey("~!@#$%^&*()_+.-/\\=", "%7E%21%40%23%24%25%5E%26%2A%28%29_%2B.-\\%5C%3D");
|
|
testEscapedKey(QString() + QChar(0xabcd) + QChar(0x1234) + QChar(0x0081), "%UABCD%U1234%81");
|
|
testEscapedKey(QString() + QChar(0xFE) + QChar(0xFF) + QChar(0x100) + QChar(0x101), "%FE%FF%U0100%U0101");
|
|
|
|
testUnescapedKey("", "", "");
|
|
testUnescapedKey("%20", " ", "%20");
|
|
testUnescapedKey("/alpha/beta", "/alpha/beta", "\\alpha\\beta");
|
|
testUnescapedKey("\\alpha\\beta", "/alpha/beta", "\\alpha\\beta");
|
|
testUnescapedKey("%5Calpha%5Cbeta", "\\alpha\\beta", "%5Calpha%5Cbeta");
|
|
testUnescapedKey("%", "%", "%25");
|
|
testUnescapedKey("%f%!%%%%1x%x1%U%Uz%U123%U1234%1234%", QString("%f%!%%%%1x%x1%U%Uz%U123") + QChar(0x1234) + "\x12" + "34%",
|
|
"%25f%25%21%25%25%25%251x%25x1%25U%25Uz%25U123%U1234%1234%25");
|
|
|
|
testEscapedStringList("", "");
|
|
testEscapedStringList(" ", "\" \"");
|
|
testEscapedStringList(";", "\";\"");
|
|
testEscapedStringList(",", "\",\"");
|
|
testEscapedStringList("=", "\"=\"");
|
|
testEscapedStringList("abc-def", "abc-def");
|
|
testEscapedStringList(QChar(0) + QString("0"), "\\0\\x30");
|
|
testEscapedStringList("~!@#$%^&*()_+.-/\\=", "\"~!@#$%^&*()_+.-/\\\\=\"");
|
|
testEscapedStringList("~!@#$%^&*()_+.-/\\", "~!@#$%^&*()_+.-/\\\\");
|
|
testEscapedStringList(QString("\x7F") + "12aFz", "\\x7f\\x31\\x32\\x61\\x46z");
|
|
testEscapedStringList(QString(" \t\n\\n") + QChar(0x123) + QChar(0x4567), "\" \\t\\n\\\\n\\x123\\x4567\"");
|
|
testEscapedStringList(QString("\a\b\f\n\r\t\v'\"?\001\002\x03\x04"), "\\a\\b\\f\\n\\r\\t\\v'\\\"?\\x1\\x2\\x3\\x4");
|
|
testEscapedStringList(QStringList() << "," << ";" << "a" << "ab, \tc, d ", "\",\", \";\", a, \"ab, \\tc, d \"");
|
|
|
|
/*
|
|
Test .ini syntax that cannot be generated by QSettings (but can be entered by users).
|
|
*/
|
|
testUnescapedStringList("", "", "");
|
|
testUnescapedStringList("\"\"", "", "");
|
|
testUnescapedStringList("\"abcdef\"", "abcdef", "abcdef");
|
|
testUnescapedStringList("\"\\?\\'\\\"\"", "?'\"", "?'\\\"");
|
|
testUnescapedStringList("\\0\\00\\000\\0000000\\1\\111\\11111\\x\\x0\\xABCDEFGH\\x0123456\\",
|
|
QString() + QChar(0) + QChar(0) + QChar(0) + QChar(0) + QChar(1)
|
|
+ QChar(0111) + QChar(011111) + QChar(0) + QChar(0xCDEF) + "GH"
|
|
+ QChar(0x3456),
|
|
"\\0\\0\\0\\0\\x1I\\x1249\\0\\xcdefGH\\x3456");
|
|
testUnescapedStringList(QByteArray("\\c\\d\\e\\f\\g\\$\\*\\\0", 16), "\f", "\\f");
|
|
testUnescapedStringList("\"a\", \t\"bc \", \" d\" , \"ef \" ,,g, hi i,,, ,",
|
|
QStringList() << "a" << "bc " << " d" << "ef " << "" << "g" << "hi i"
|
|
<< "" << "" << "" << "",
|
|
"a, \"bc \", \" d\", \"ef \", , g, hi i, , , , ");
|
|
testUnescapedStringList("a , b , c d , efg ",
|
|
QStringList() << "a" << "b" << "c d" << "efg",
|
|
"a, b, c d, efg");
|
|
|
|
// streaming qvariant into a string
|
|
testVariant(QString("Hello World!"), QString("Hello World!"), toString);
|
|
testVariant(QString("Hello, World!"), QString("Hello, World!"), toString);
|
|
testVariant(QString("@Hello World!"), QString("@@Hello World!"), toString);
|
|
testVariant(QString("@@Hello World!"), QString("@@@Hello World!"), toString);
|
|
testVariant(QByteArray("Hello World!"), QString("@ByteArray(Hello World!)"), toString);
|
|
testVariant(QByteArray("@Hello World!"), QString("@ByteArray(@Hello World!)"), toString);
|
|
testVariant(QVariant(100), QString("100"), toString);
|
|
testVariant(QStringList() << "ene" << "due" << "rike", QString::fromLatin1("@Variant(\x0\x0\x0\xb\x0\x0\x0\x3\x0\x0\x0\x6\x0\x65\x0n\x0\x65\x0\x0\x0\x6\x0\x64\x0u\x0\x65\x0\x0\x0\x8\x0r\x0i\x0k\x0\x65)", 50), toStringList);
|
|
testVariant(QRect(1, 2, 3, 4), QString("@Rect(1 2 3 4)"), toRect);
|
|
testVariant(QSize(5, 6), QString("@Size(5 6)"), toSize);
|
|
testVariant(QPoint(7, 8), QString("@Point(7 8)"), toPoint);
|
|
|
|
testBadEscape("", "");
|
|
testBadEscape("@", "@");
|
|
testBadEscape("@@", "@");
|
|
testBadEscape("@@@", "@@");
|
|
testBadEscape(" ", " ");
|
|
testBadEscape("@Rect", "@Rect");
|
|
testBadEscape("@Rect(", "@Rect(");
|
|
testBadEscape("@Rect()", "@Rect()");
|
|
testBadEscape("@Rect)", "@Rect)");
|
|
testBadEscape("@Rect(1 2 3)", "@Rect(1 2 3)");
|
|
testBadEscape("@@Rect(1 2 3)", "@Rect(1 2 3)");
|
|
#endif
|
|
}
|
|
|
|
void tst_QSettings::testCaseSensitivity_data()
|
|
{
|
|
populateWithFormats();
|
|
}
|
|
|
|
void tst_QSettings::testCaseSensitivity()
|
|
{
|
|
QFETCH(QSettings::Format, format);
|
|
|
|
for (int pass = 0; pass < 2; ++pass) {
|
|
QSettings settings(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
settings.beginGroup("caseSensitivity");
|
|
|
|
bool cs = true;
|
|
#ifndef QT_QSETTINGS_ALWAYS_CASE_SENSITIVE_AND_FORGET_ORIGINAL_KEY_ORDER
|
|
switch (format) {
|
|
case QSettings::NativeFormat:
|
|
#ifdef Q_OS_DARWIN
|
|
cs = true;
|
|
#else
|
|
cs = false;
|
|
#endif
|
|
break;
|
|
case QSettings::IniFormat:
|
|
cs = false;
|
|
break;
|
|
case QSettings::CustomFormat1:
|
|
cs = true;
|
|
break;
|
|
case QSettings::CustomFormat2:
|
|
cs = false;
|
|
break;
|
|
default:
|
|
;
|
|
}
|
|
#endif
|
|
|
|
if (pass == 0) {
|
|
settings.setValue("key 1", 1);
|
|
settings.setValue("KEY 1", 2);
|
|
settings.setValue("key 2", 3);
|
|
}
|
|
|
|
for (int i = 0; i < 2; ++i) {
|
|
QVERIFY(settings.contains("key 1"));
|
|
QVERIFY(settings.contains("KEY 1"));
|
|
QCOMPARE(settings.value("KEY 1").toInt(), 2);
|
|
/* QVERIFY(settings.allKeys().contains("/KEY 1"));
|
|
QVERIFY(settings.allKeys().contains("/key 2")); */
|
|
|
|
if (cs) {
|
|
QVERIFY(!settings.contains("kEy 1"));
|
|
QCOMPARE(settings.value("key 1").toInt(), 1);
|
|
QCOMPARE(settings.allKeys().size(), 3);
|
|
QVERIFY(settings.allKeys().contains("key 1"));
|
|
} else {
|
|
QVERIFY(settings.contains("kEy 1"));
|
|
QCOMPARE(settings.value("kEy 1").toInt(), 2);
|
|
QCOMPARE(settings.value("key 1").toInt(), 2);
|
|
QCOMPARE(settings.allKeys().size(), 2);
|
|
}
|
|
|
|
settings.sync();
|
|
}
|
|
|
|
settings.remove("KeY 1");
|
|
|
|
if (cs) {
|
|
QVERIFY(!settings.contains("KeY 1"));
|
|
QVERIFY(settings.contains("key 1"));
|
|
QVERIFY(settings.contains("KEY 1"));
|
|
QCOMPARE(settings.value("key 1").toInt(), 1);
|
|
QCOMPARE(settings.value("KEY 1").toInt(), 2);
|
|
QCOMPARE(settings.allKeys().size(), 3);
|
|
} else {
|
|
QVERIFY(!settings.contains("KeY 1"));
|
|
QVERIFY(!settings.contains("key 1"));
|
|
QVERIFY(!settings.contains("KEY 1"));
|
|
QCOMPARE(settings.allKeys().size(), 1);
|
|
}
|
|
settings.setValue("KEY 1", 2);
|
|
}
|
|
}
|
|
|
|
void tst_QSettings::fileName()
|
|
{
|
|
#ifdef Q_OS_MAC
|
|
QSettings s1(QSettings::UserScope, "Apple", "Console");
|
|
QSettings s2(QSettings::UserScope, "Apple");
|
|
QSettings s3(QSettings::SystemScope, "Apple", "Console");
|
|
QSettings s4(QSettings::SystemScope, "Apple");
|
|
|
|
QCOMPARE(s1.fileName(), QDir::homePath() + "/Library/Preferences/com.apple.Console.plist");
|
|
QCOMPARE(s2.fileName(), QDir::homePath() + "/Library/Preferences/com.apple.plist");
|
|
QCOMPARE(s3.fileName(), QString("/Library/Preferences/com.apple.Console.plist"));
|
|
QCOMPARE(s4.fileName(), QString("/Library/Preferences/com.apple.plist"));
|
|
|
|
QSettings s5(QSettings::SystemScope, "Apple.com", "Console");
|
|
QCOMPARE(s5.fileName(), QString("/Library/Preferences/com.apple.Console.plist"));
|
|
|
|
QSettings s6(QSettings::SystemScope, "apple.com", "Console");
|
|
QCOMPARE(s6.fileName(), QString("/Library/Preferences/com.apple.Console.plist"));
|
|
|
|
QSettings s7(QSettings::SystemScope, "apple.Com", "Console");
|
|
QCOMPARE(s7.fileName(), QString("/Library/Preferences/com.apple.Console.plist"));
|
|
|
|
QSettings s8(QSettings::SystemScope, "apple.fr", "Console");
|
|
QCOMPARE(s8.fileName(), QString("/Library/Preferences/fr.apple.Console.plist"));
|
|
|
|
QSettings s9(QSettings::SystemScope, "apple.co.jp", "Console");
|
|
QCOMPARE(s9.fileName(), QString("/Library/Preferences/jp.co.apple.Console.plist"));
|
|
|
|
QSettings s10(QSettings::SystemScope, "apple.org", "Console");
|
|
QCOMPARE(s10.fileName(), QString("/Library/Preferences/org.apple.Console.plist"));
|
|
|
|
QSettings s11(QSettings::SystemScope, "apple.net", "Console");
|
|
QCOMPARE(s11.fileName(), QString("/Library/Preferences/net.apple.Console.plist"));
|
|
|
|
QSettings s12(QSettings::SystemScope, "apple.museum", "Console");
|
|
QCOMPARE(s12.fileName(), QString("/Library/Preferences/museum.apple.Console.plist"));
|
|
|
|
QSettings s13(QSettings::SystemScope, "apple.FR", "Console");
|
|
QCOMPARE(s13.fileName(), QString("/Library/Preferences/fr.apple.Console.plist"));
|
|
|
|
QSettings s14(QSettings::SystemScope, "apple.mUseum", "Console");
|
|
QCOMPARE(s14.fileName(), QString("/Library/Preferences/museum.apple.Console.plist"));
|
|
|
|
QSettings s15(QSettings::SystemScope, "apple.zz", "Console");
|
|
QCOMPARE(s15.fileName(), QString("/Library/Preferences/zz.apple.Console.plist"));
|
|
|
|
QSettings s15_prime(QSettings::SystemScope, "apple.foo", "Console");
|
|
QCOMPARE(s15_prime.fileName(), QString("/Library/Preferences/com.apple-foo.Console.plist"));
|
|
|
|
QSettings s16(QSettings::SystemScope, "apple.f", "Console");
|
|
QCOMPARE(s16.fileName(), QString("/Library/Preferences/com.apple-f.Console.plist"));
|
|
|
|
QSettings s17(QSettings::SystemScope, "apple.", "Console");
|
|
QCOMPARE(s17.fileName(), QString("/Library/Preferences/com.apple.Console.plist"));
|
|
|
|
QSettings s18(QSettings::SystemScope, "Foo, Inc.", "Console");
|
|
QCOMPARE(s18.fileName(), QString("/Library/Preferences/com.foo-inc.Console.plist"));
|
|
|
|
QSettings s19(QSettings::SystemScope, "Foo, Inc.com", "Console");
|
|
QCOMPARE(s19.fileName(), QString("/Library/Preferences/com.foo, inc.Console.plist"));
|
|
|
|
QSettings s20(QSettings::SystemScope, QLatin1String(" ") + QChar(0xbd) + QLatin1String("Foo//:/Barxxx Baz!()#@.com"), "Console");
|
|
QCOMPARE(s20.fileName(), QLatin1String("/Library/Preferences/com. ") + QChar(0xbd) + QLatin1String("foo : barxxx baz!()#@.Console.plist"));
|
|
|
|
QSettings s21(QSettings::SystemScope, QLatin1String(" ") + QChar(0xbd) + QLatin1String("Foo//:/Bar,,, Baz!()#"), "Console");
|
|
QCOMPARE(s21.fileName(), QString("/Library/Preferences/com.foo-bar-baz.Console.plist"));
|
|
#else
|
|
QSKIP("Please write a fileName() test for the other platforms", SkipAll);
|
|
#endif
|
|
}
|
|
|
|
void tst_QSettings::isWritable_data()
|
|
{
|
|
populateWithFormats();
|
|
}
|
|
|
|
void tst_QSettings::isWritable()
|
|
{
|
|
QFETCH(QSettings::Format, format);
|
|
|
|
{
|
|
QSettings s1(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
s1.setValue("foo", 1);
|
|
s1.sync();
|
|
// that should create the file
|
|
}
|
|
|
|
{
|
|
QSettings s1(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
QVERIFY(s1.isWritable());
|
|
}
|
|
|
|
{
|
|
QSettings s1(format, QSettings::SystemScope, "software.org", "KillerAPP");
|
|
s1.setValue("foo", 1);
|
|
s1.sync();
|
|
// that should create the file, *if* we have the permissions
|
|
}
|
|
|
|
{
|
|
QSettings s1(format, QSettings::SystemScope, "software.org", "KillerAPP");
|
|
QSettings s2(format, QSettings::SystemScope, "software.org", "Something Different");
|
|
QSettings s3(format, QSettings::SystemScope, "foo.org", "Something Different");
|
|
if (s1.contains("foo")) {
|
|
QVERIFY(s1.isWritable());
|
|
QVERIFY(s2.isWritable());
|
|
QVERIFY(s3.isWritable());
|
|
} else {
|
|
QVERIFY(!s1.isWritable());
|
|
QVERIFY(!s2.isWritable());
|
|
QVERIFY(!s3.isWritable());
|
|
}
|
|
}
|
|
}
|
|
|
|
void tst_QSettings::childGroups_data()
|
|
{
|
|
populateWithFormats();
|
|
}
|
|
|
|
void tst_QSettings::childGroups()
|
|
{
|
|
#ifdef QT_BUILD_INTERNAL
|
|
QFETCH(QSettings::Format, format);
|
|
|
|
{
|
|
QSettings settings(format, QSettings::SystemScope, "software.org");
|
|
settings.setValue("alpha", "1");
|
|
settings.setValue("alpha/a", "2");
|
|
settings.setValue("alpha/b", "3");
|
|
settings.setValue("alpha/c", "4");
|
|
settings.setValue("beta", "5");
|
|
settings.setValue("gamma", "6");
|
|
settings.setValue("gamma/d", "7");
|
|
settings.setValue("gamma/d/e", "8");
|
|
settings.setValue("gamma/f/g", "9");
|
|
settings.setValue("omicron/h/i/j/x", "10");
|
|
settings.setValue("omicron/h/i/k/y", "11");
|
|
settings.setValue("zeta/z", "12");
|
|
}
|
|
|
|
for (int pass = 0; pass < 3; ++pass) {
|
|
QConfFile::clearCache();
|
|
QSettings settings(format, QSettings::SystemScope, "software.org");
|
|
settings.setFallbacksEnabled(false);
|
|
if (pass == 1) {
|
|
settings.value("gamma/d");
|
|
} else if (pass == 2) {
|
|
settings.value("gamma");
|
|
}
|
|
|
|
settings.beginGroup("gamma");
|
|
QCOMPARE(settings.childGroups(), QStringList() << "d" << "f");
|
|
settings.beginGroup("d");
|
|
QCOMPARE(settings.childGroups(), QStringList());
|
|
settings.endGroup();
|
|
settings.endGroup();
|
|
|
|
settings.beginGroup("alpha");
|
|
QCOMPARE(settings.childGroups(), QStringList());
|
|
settings.endGroup();
|
|
|
|
settings.beginGroup("d");
|
|
QCOMPARE(settings.childGroups(), QStringList());
|
|
settings.endGroup();
|
|
|
|
settings.beginGroup("/omicron///h/i///");
|
|
QCOMPARE(settings.childGroups(), QStringList() << "j" << "k");
|
|
settings.endGroup();
|
|
|
|
settings.beginGroup("////");
|
|
QCOMPARE(settings.childGroups(), QStringList() << "alpha" << "gamma" << "omicron" << "zeta");
|
|
settings.endGroup();
|
|
|
|
QCOMPARE(settings.childGroups(), QStringList() << "alpha" << "gamma" << "omicron" << "zeta");
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void tst_QSettings::childKeys_data()
|
|
{
|
|
populateWithFormats();
|
|
}
|
|
|
|
void tst_QSettings::childKeys()
|
|
{
|
|
#ifdef QT_BUILD_INTERNAL
|
|
QFETCH(QSettings::Format, format);
|
|
|
|
{
|
|
QSettings settings(format, QSettings::SystemScope, "software.org");
|
|
settings.setValue("alpha", "1");
|
|
settings.setValue("alpha/a", "2");
|
|
settings.setValue("alpha/b", "3");
|
|
settings.setValue("alpha/c", "4");
|
|
settings.setValue("beta", "5");
|
|
settings.setValue("gamma", "6");
|
|
settings.setValue("gamma/d", "7");
|
|
settings.setValue("gamma/d/e", "8");
|
|
settings.setValue("gamma/f/g", "9");
|
|
settings.setValue("omicron/h/i/j/x", "10");
|
|
settings.setValue("omicron/h/i/k/y", "11");
|
|
settings.setValue("zeta/z", "12");
|
|
}
|
|
|
|
for (int pass = 0; pass < 3; ++pass) {
|
|
QConfFile::clearCache();
|
|
QSettings settings(format, QSettings::SystemScope, "software.org");
|
|
settings.setFallbacksEnabled(false);
|
|
if (pass == 1) {
|
|
settings.value("gamma/d");
|
|
} else if (pass == 2) {
|
|
settings.value("gamma");
|
|
}
|
|
|
|
settings.beginGroup("gamma");
|
|
QCOMPARE(settings.childKeys(), QStringList() << "d");
|
|
settings.beginGroup("d");
|
|
QCOMPARE(settings.childKeys(), QStringList() << "e");
|
|
settings.endGroup();
|
|
settings.endGroup();
|
|
|
|
settings.beginGroup("alpha");
|
|
QCOMPARE(settings.childKeys(), QStringList() << "a" << "b" << "c");
|
|
settings.endGroup();
|
|
|
|
settings.beginGroup("d");
|
|
QCOMPARE(settings.childKeys(), QStringList());
|
|
settings.endGroup();
|
|
|
|
settings.beginGroup("/omicron///h/i///");
|
|
QCOMPARE(settings.childKeys(), QStringList());
|
|
settings.endGroup();
|
|
|
|
settings.beginGroup("////");
|
|
QCOMPARE(settings.childKeys(), QStringList() << "alpha" << "beta" << "gamma");
|
|
settings.endGroup();
|
|
|
|
QCOMPARE(settings.childKeys(), QStringList() << "alpha" << "beta" << "gamma");
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void tst_QSettings::allKeys_data()
|
|
{
|
|
populateWithFormats();
|
|
}
|
|
|
|
void tst_QSettings::allKeys()
|
|
{
|
|
#ifdef QT_BUILD_INTERNAL
|
|
QFETCH(QSettings::Format, format);
|
|
|
|
QStringList allKeys;
|
|
allKeys << "alpha" << "alpha/a" << "alpha/b" << "alpha/c" << "beta" << "gamma" << "gamma/d"
|
|
<< "gamma/d/e" << "gamma/f/g" << "omicron/h/i/j/x" << "omicron/h/i/k/y" << "zeta/z";
|
|
|
|
{
|
|
QSettings settings(format, QSettings::SystemScope, "software.org");
|
|
for (int i = 0; i < allKeys.size(); ++i)
|
|
settings.setValue(allKeys.at(i), QString::number(i + 1));
|
|
}
|
|
|
|
for (int pass = 0; pass < 3; ++pass) {
|
|
QConfFile::clearCache();
|
|
QSettings settings(format, QSettings::SystemScope, "software.org");
|
|
settings.setFallbacksEnabled(false);
|
|
|
|
if (pass == 1) {
|
|
settings.value("gamma/d");
|
|
} else if (pass == 2) {
|
|
settings.value("gamma");
|
|
}
|
|
|
|
settings.beginGroup("gamma");
|
|
QCOMPARE(settings.allKeys(), QStringList() << "d" << "d/e" << "f/g");
|
|
settings.beginGroup("d");
|
|
QCOMPARE(settings.allKeys(), QStringList() << "e");
|
|
settings.endGroup();
|
|
settings.endGroup();
|
|
|
|
settings.beginGroup("alpha");
|
|
QCOMPARE(settings.allKeys(), QStringList() << "a" << "b" << "c");
|
|
settings.endGroup();
|
|
|
|
settings.beginGroup("d");
|
|
QCOMPARE(settings.allKeys(), QStringList());
|
|
settings.endGroup();
|
|
|
|
settings.beginGroup("/omicron///h/i///");
|
|
QCOMPARE(settings.allKeys(), QStringList() << "j/x" << "k/y");
|
|
settings.endGroup();
|
|
|
|
settings.beginGroup("////");
|
|
QCOMPARE(settings.allKeys(), allKeys);
|
|
settings.endGroup();
|
|
|
|
QCOMPARE(settings.allKeys(), allKeys);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void tst_QSettings::registerFormat()
|
|
{
|
|
QSettings settings1(QSettings::IniFormat, QSettings::UserScope, "software.org", "KillerAPP");
|
|
QSettings settings2(QSettings::CustomFormat1, QSettings::UserScope, "software.org", "KillerAPP");
|
|
|
|
QString fileName = settings1.fileName();
|
|
fileName.chop(3); // "ini";
|
|
fileName.append("custom1");
|
|
QCOMPARE(settings2.fileName(), fileName);
|
|
|
|
// OK, let's see if it can read a generated file of a custom type
|
|
// Beware: readCustom3File() and writeCustom3File() have unintuitive behavior
|
|
// so we can test error handling
|
|
|
|
QSettings::Format custom3 = QSettings::registerFormat("custom3", readCustom3File, writeCustom3File);
|
|
QVERIFY(custom3 == QSettings::CustomFormat3);
|
|
|
|
QDir dir(settingsPath());
|
|
QVERIFY(dir.mkpath("someDir"));
|
|
QFile f(dir.path()+"/someDir/someSettings.custom3");
|
|
|
|
QVERIFY(f.open(QFile::WriteOnly));
|
|
f.write("OK");
|
|
f.close();
|
|
|
|
{
|
|
QSettings settings(settingsPath("someDir/someSettings.custom3"), QSettings::CustomFormat3);
|
|
QCOMPARE(settings.status(), QSettings::NoError);
|
|
QCOMPARE(settings.value("retval").toString(), QString("OK"));
|
|
QVERIFY(settings.isWritable());
|
|
}
|
|
|
|
QVERIFY(f.open(QFile::WriteOnly));
|
|
f.write("NotOK");
|
|
f.close();
|
|
|
|
{
|
|
QSettings settings(settingsPath("someDir/someSettings.custom3"), QSettings::CustomFormat3);
|
|
QCOMPARE(settings.status(), QSettings::FormatError);
|
|
QCOMPARE(settings.value("retval").toString(), QString());
|
|
QVERIFY(settings.isWritable());
|
|
}
|
|
|
|
QVERIFY(f.open(QFile::WriteOnly));
|
|
f.write("OK");
|
|
f.close();
|
|
|
|
{
|
|
QSettings settings(settingsPath("someDir/someSettings.custom3"), QSettings::CustomFormat3);
|
|
QCOMPARE(settings.status(), QSettings::NoError);
|
|
settings.setValue("zzz", "bar");
|
|
settings.sync();
|
|
QCOMPARE(settings.status(), QSettings::NoError);
|
|
|
|
settings.setValue("retval", "NotOK");
|
|
settings.sync();
|
|
QCOMPARE(settings.status(), QSettings::AccessError);
|
|
|
|
QCOMPARE(settings.value("retval").toString(), QString("NotOK"));
|
|
QVERIFY(settings.isWritable());
|
|
}
|
|
|
|
{
|
|
QSettings settings(settingsPath("someDir/someSettings.custom3"), QSettings::CustomFormat4);
|
|
QCOMPARE(settings.status(), QSettings::AccessError);
|
|
QVERIFY(!settings.isWritable());
|
|
}
|
|
}
|
|
|
|
void tst_QSettings::setPath()
|
|
{
|
|
#define TEST_PATH(doSet, ext, format, scope, path) \
|
|
{ \
|
|
if (doSet) \
|
|
QSettings::setPath(QSettings::format, QSettings::scope, settingsPath(path)); \
|
|
QSettings settings1(QSettings::format, QSettings::scope, "software.org", "KillerAPP"); \
|
|
QCOMPARE(QDir(settings1.fileName()), QDir(settingsPath(path) + QDir::separator() + "software.org" \
|
|
+ QDir::separator() + "KillerAPP." + ext)); \
|
|
}
|
|
|
|
/*
|
|
The first pass checks that setPath() works; the second
|
|
path checks that it has no bad side effects.
|
|
*/
|
|
for (int i = 0; i < 2; ++i) {
|
|
#if !defined(Q_OS_WIN) && !defined(Q_OS_MAC)
|
|
TEST_PATH(i == 0, "conf", NativeFormat, UserScope, "alpha")
|
|
TEST_PATH(i == 0, "conf", NativeFormat, SystemScope, "beta")
|
|
#endif
|
|
TEST_PATH(i == 0, "ini", IniFormat, UserScope, "gamma")
|
|
TEST_PATH(i == 0, "ini", IniFormat, SystemScope, "omicron")
|
|
TEST_PATH(i == 0, "custom1", CustomFormat1, UserScope, "epsilon")
|
|
TEST_PATH(i == 0, "custom1", CustomFormat1, SystemScope, "zeta")
|
|
TEST_PATH(i == 0, "custom2", CustomFormat2, UserScope, "eta")
|
|
TEST_PATH(i == 0, "custom2", CustomFormat2, SystemScope, "iota")
|
|
}
|
|
}
|
|
|
|
void tst_QSettings::setDefaultFormat()
|
|
{
|
|
QVERIFY(QSettings::defaultFormat() == QSettings::NativeFormat);
|
|
|
|
QSettings::setDefaultFormat(QSettings::CustomFormat1);
|
|
QSettings settings1("org", "app");
|
|
QSettings settings2(QSettings::SystemScope, "org", "app");
|
|
QSettings settings3;
|
|
|
|
QVERIFY(settings1.format() == QSettings::NativeFormat);
|
|
QVERIFY(settings2.format() == QSettings::NativeFormat);
|
|
QVERIFY(settings3.format() == QSettings::CustomFormat1);
|
|
|
|
QSettings::setDefaultFormat(QSettings::NativeFormat);
|
|
QVERIFY(QSettings::defaultFormat() == QSettings::NativeFormat);
|
|
|
|
QVERIFY(settings1.format() == QSettings::NativeFormat);
|
|
QVERIFY(settings2.format() == QSettings::NativeFormat);
|
|
QVERIFY(settings3.format() == QSettings::CustomFormat1);
|
|
}
|
|
|
|
void tst_QSettings::dontCreateNeedlessPaths()
|
|
{
|
|
QString path;
|
|
{
|
|
QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Hello", "Test");
|
|
QVariant val = settings.value("foo", "bar");
|
|
path = settings.fileName();
|
|
}
|
|
|
|
QFileInfo fileInfo(path);
|
|
QVERIFY(!fileInfo.dir().exists());
|
|
}
|
|
|
|
#if !defined(Q_OS_WIN) && !defined(Q_OS_SYMBIAN)
|
|
void tst_QSettings::dontReorderIniKeysNeedlessly()
|
|
{
|
|
#ifdef QT_QSETTINGS_ALWAYS_CASE_SENSITIVE_AND_FORGET_ORIGINAL_KEY_ORDER
|
|
QSKIP("This Qt build does not preserve ordering, as a code size optimization.", SkipAll);
|
|
#endif
|
|
|
|
/*
|
|
This is a very strong test. It asserts that modifying
|
|
resourcefile2.ini will lead to the exact contents of
|
|
resourcefile3.ini. Right now it's run only on Unix
|
|
systems, but that should be enough since the INI
|
|
code (unlike this test) is platform-agnostic.
|
|
|
|
Things that are tested:
|
|
|
|
* keys are written in the same order that they were
|
|
read in
|
|
|
|
* new keys are put at the end of their respective
|
|
sections
|
|
*/
|
|
|
|
QFile inFile(":/resourcefile2.ini");
|
|
inFile.open(QIODevice::ReadOnly);
|
|
QByteArray contentsBefore = inFile.readAll();
|
|
inFile.close();
|
|
|
|
QByteArray expectedContentsAfter;
|
|
|
|
{
|
|
QFile inFile(":/resourcefile3.ini");
|
|
inFile.open(QIODevice::ReadOnly);
|
|
expectedContentsAfter = inFile.readAll();
|
|
inFile.close();
|
|
}
|
|
|
|
QString outFileName;
|
|
QString outFileName2;
|
|
|
|
QTemporaryFile outFile;
|
|
outFile.open();
|
|
outFile.write(contentsBefore);
|
|
outFileName = outFile.fileName();
|
|
outFile.close();
|
|
|
|
QSettings settings(outFileName, QSettings::IniFormat);
|
|
QVERIFY(settings.status() == QSettings::NoError);
|
|
QVERIFY(settings.isWritable());
|
|
|
|
settings.setValue("Field 1/Bottom", 90);
|
|
settings.setValue("Field 1/x", 1);
|
|
settings.setValue("Field 1/y", 1);
|
|
settings.setValue("Field 1/width", 1);
|
|
settings.setValue("Field 1/height", 1);
|
|
settings.sync();
|
|
|
|
QFile outFile2(outFileName);
|
|
QVERIFY(outFile2.open(QIODevice::ReadOnly));
|
|
QCOMPARE(outFile2.readAll(), expectedContentsAfter);
|
|
outFile2.close();
|
|
}
|
|
#endif
|
|
|
|
void tst_QSettings::rainersSyncBugOnMac_data()
|
|
{
|
|
ctor_data();
|
|
}
|
|
|
|
void tst_QSettings::rainersSyncBugOnMac()
|
|
{
|
|
QFETCH(QSettings::Format, format);
|
|
|
|
QString fileName;
|
|
|
|
{
|
|
QSettings s1(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
QCOMPARE(s1.value("key1", 5).toInt(), 5);
|
|
fileName = s1.fileName();
|
|
}
|
|
|
|
{
|
|
QSettings s2(fileName, format);
|
|
s2.setValue("key1", 25);
|
|
}
|
|
|
|
{
|
|
QSettings s3(format, QSettings::UserScope, "software.org", "KillerAPP");
|
|
QCOMPARE(s3.value("key1", 30).toInt(), 25);
|
|
}
|
|
}
|
|
|
|
void tst_QSettings::recursionBug()
|
|
{
|
|
QPixmap pix(10,10);
|
|
pix.fill("blue");
|
|
|
|
{
|
|
QSettings settings(settingsPath("starrunner.ini"), QSettings::IniFormat);
|
|
settings.setValue("General/Pixmap", pix );
|
|
}
|
|
}
|
|
|
|
#if defined(Q_OS_WIN)
|
|
|
|
static DWORD readKeyType(HKEY handle, const QString &rSubKey)
|
|
{
|
|
DWORD dataType;
|
|
DWORD dataSize;
|
|
LONG res = RegQueryValueEx(handle, reinterpret_cast<const wchar_t *>(rSubKey.utf16()), 0, &dataType, 0, &dataSize);
|
|
|
|
if (res == ERROR_SUCCESS)
|
|
return dataType;
|
|
|
|
return 0;
|
|
}
|
|
|
|
void tst_QSettings::qtbug_13249()
|
|
{
|
|
QSettings settings1(QSettings::UserScope, "software.org", "KillerAPP");
|
|
|
|
qint32 x = 1024;
|
|
settings1.setValue("qtbug_13249_a", (qint32)x);
|
|
QCOMPARE(settings1.value("qtbug_13249_a").toInt(), (qint32)1024);
|
|
settings1.setValue("qtbug_13249_b", (quint32)x);
|
|
QCOMPARE(settings1.value("qtbug_13249_b").toUInt(), (quint32)1024);
|
|
settings1.setValue("qtbug_13249_c", (qint64)x);
|
|
QCOMPARE(settings1.value("qtbug_13249_c").toLongLong(), (qint64)1024);
|
|
settings1.setValue("qtbug_13249_d", (quint64)x);
|
|
QCOMPARE(settings1.value("qtbug_13249_d").toULongLong(), (quint64)1024);
|
|
settings1.sync();
|
|
|
|
HKEY handle;
|
|
LONG res;
|
|
QString keyName = "Software\\software.org\\KillerAPP";
|
|
res = RegOpenKeyEx(HKEY_CURRENT_USER, reinterpret_cast<const wchar_t *>(keyName.utf16()), 0, KEY_READ, &handle);
|
|
if (res == ERROR_SUCCESS)
|
|
{
|
|
DWORD dataType;
|
|
dataType = readKeyType(handle, QString("qtbug_13249_a"));
|
|
if (dataType != 0) {
|
|
QCOMPARE((int)REG_DWORD, (int)dataType);
|
|
}
|
|
dataType = readKeyType(handle, QString("qtbug_13249_b"));
|
|
if (dataType != 0) {
|
|
QCOMPARE((int)REG_DWORD, (int)dataType);
|
|
}
|
|
dataType = readKeyType(handle, QString("qtbug_13249_c"));
|
|
if (dataType != 0) {
|
|
QCOMPARE((int)REG_QWORD, (int)dataType);
|
|
}
|
|
dataType = readKeyType(handle, QString("qtbug_13249_d"));
|
|
if (dataType != 0) {
|
|
QCOMPARE((int)REG_QWORD, (int)dataType);
|
|
}
|
|
RegCloseKey(handle);
|
|
}
|
|
}
|
|
#endif
|
|
/*
|
|
// Not tested at the moment.
|
|
void tst_QSettings::oldSubkeyList()
|
|
{
|
|
QVERIFY( TRUE );
|
|
}
|
|
*/
|
|
|
|
QTEST_MAIN(tst_QSettings)
|
|
#include "tst_qsettings.moc"
|
|
|
|
|
|
// foo
|