10#include <QtCore/QBuffer>
11#include <QtCore/QDebug>
12#include <QtCore/qmath.h>
13#include <QtCore/QTemporaryFile>
14#include <QtCore/QTextStream>
90QList<UpgradeTestHelper::TestCase> UpgradeTestHelper::readRecipe(QIODevice *recipe)
92 QList<TestCase> testCases;
94 while (!recipe->atEnd()) {
95 const QString line = recipe->readLine().trimmed();
96 if (line.startsWith(
'#') || line.isEmpty())
98 const QStringList splitted = line.split(
':');
99 Q_ASSERT_X(splitted.count() == 3, Q_FUNC_INFO,
100 qPrintable(QString(
"Inalid recipe line '%1'").arg(line)));
101 testCases.append(
TestCase(splitted.at(0), splitted.at(1), splitted.at(2)));
107void UpgradeTestHelper::fillSettings(QSettings *settings,
const QList<TestCase> &testCases)
109 settings->setValue(
"configVersion", CurrentVersion);
111 foreach (
const QString &group, groups()) {
112 settings->beginGroup(group);
114 foreach (
const TestCase &testCase, testCases) {
115 if (!testCase.current().isEmpty()) {
116 settings->setValue(testCase.key(), testCase.current());
120 settings->endGroup();
126void UpgradeTestHelper::fillDefaultSettings(QSettings *defaultSettings,
const QList<TestCase>
129 defaultSettings->setValue(
"configVersion", HistoryLength);
131 QHash<QString, QString> lastSetValue;
133 for (
int revision = 1; revision <= HistoryLength; ++revision) {
134 defaultSettings->beginGroup(QString::number(revision));
136 QStringList keysToRemove;
138 foreach (
const QString &group, groups()) {
139 defaultSettings->beginGroup(group);
141 foreach (
const TestCase &testCase, testCases) {
142 switch (testCase.history().at(revision - 1).toLatin1()) {
144 lastSetValue[testCase.key()] = QString(
"v%1-default").arg(revision);
145 defaultSettings->setValue(testCase.key(), lastSetValue[testCase.key()]);
149 Q_ASSERT_X(!lastSetValue[testCase.key()].isEmpty(), Q_FUNC_INFO,
150 qPrintable(QString(
"Inalid TestCase::history: '%1'").arg(testCase.history())));
151 defaultSettings->setValue(testCase.key(), lastSetValue[testCase.key()]);
155 keysToRemove.append((group.isEmpty() ? group : group +
"/") + testCase.key());
156 lastSetValue.remove(testCase.key());
163 Q_ASSERT_X(
false, Q_FUNC_INFO, qPrintable(QString(
164 "Inalid TestCase::history: '%1': invalid command-code '%2'")
165 .arg(testCase.history())
166 .arg(testCase.history().at(revision - 1))));
171 defaultSettings->endGroup();
174 if (!keysToRemove.isEmpty()) {
175 defaultSettings->setValue(
"cmd-remove", keysToRemove);
178 defaultSettings->endGroup();
181 defaultSettings->sync();
184bool UpgradeTestHelper::generateSnapshotRecipe(QTextStream *out)
186 const QString actions =
"SKRN";
189 buf.open(QIODevice::ReadWrite);
190 QTextStream stream(&buf);
193 for (
int i = 0; i < qPow(actions.count(), HistoryLength); ++i) {
194 QString history = QString::number(i, actions.count());
196 history.prepend(QString(HistoryLength - history.length(),
'0'));
197 for (
int revision = 0; revision < history.length(); ++revision) {
198 history.replace(revision, 1, actions.at(history.at(revision).digitValue()));
201 static const QRegExp invalidSequence(
"(^[^S]*K|R[^S]*K|^R)");
202 if (history.contains(invalidSequence)) {
206 for (
int revision = 0; revision < HistoryLength; ++revision) {
207 stream << history << QString(
":v%1-default:\n").arg(revision);
210 stream << history <<
":custom:\n";
217 QList<TestCase> testCases = readRecipe(&buf);
220 QTemporaryFile settingsFile;
221 if (!settingsFile.open()) {
225 QSettings settings(settingsFile.fileName(), QSettings::IniFormat);
227 fillSettings(&settings, testCases);
230 QTemporaryFile defaultSettingsFile;
231 if (!defaultSettingsFile.open()) {
235 QSettings defaultSettings(defaultSettingsFile.fileName(), QSettings::IniFormat);
237 fillDefaultSettings(&defaultSettings, testCases);
240 SsuSettings ssuSettings(settingsFile.fileName(), QSettings::IniFormat,
241 defaultSettingsFile.fileName());
244 foreach (
const UpgradeTestHelper::TestCase &testCase, testCases) {
245 const QString expected = ssuSettings.contains(testCase.key())
246 ? ssuSettings.value(testCase.key()).toString()
248 *out << QString(
"%1:%2:%3\n")
249 .arg(testCase.history())
250 .arg(testCase.current())
257QStringList UpgradeTestHelper::groups()
259 static const QStringList groups = QStringList() <<
"" <<
"groupA";