123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- /*=========================================================================
- Library: CTK
- Copyright (c) Kitware Inc.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0.txt
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- =========================================================================*/
- // Qt includes
- #include <QApplication>
- #include <QSettings>
- #include <QSignalSpy>
- #include <QSpinBox>
- // CTK includes
- #include "ctkSettingsPanel.h"
- #include "ctkSettingsPanelTest2Helper.h"
- #include "ctkTest.h"
- // STD includes
- #include <cstdlib>
- #include <iostream>
- // ----------------------------------------------------------------------------
- class ctkSettingsPanelTester: public QObject
- {
- Q_OBJECT
- private slots:
- void testChangeProperty();
- void testChangeProperty_data();
- void testEmptyQStringList();
- };
- //-----------------------------------------------------------------------------
- void ctkSettingsPanelTester::testChangeProperty()
- {
- QFETCH(bool, registerSpecificSettings);
- QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Common ToolKit", "CTK");
- QSettings specificSettings(QSettings::IniFormat, QSettings::UserScope, "Common ToolKit", "CTK-specific");
-
- // Clear settings
- settings.clear();
- settings.sync();
- specificSettings.clear();
- specificSettings.sync();
-
- QSpinBox spinBox;
- ctkSettingsPanel panel;
- panel.setSettings(&settings);
- spinBox.setValue(1);
- QFETCH(QString, label);
- QFETCH(ctkSettingsPanel::SettingOptions, options);
- panel.registerProperty("property", &spinBox,
- "value", SIGNAL(valueChanged(int)),
- label, options, registerSpecificSettings ? &specificSettings : 0);
- QCOMPARE(spinBox.value(), 1);
- QCOMPARE(panel.settingLabel("property"), label);
- QCOMPARE(panel.settingOptions("property"), options);
- qRegisterMetaType<QVariant>("QVariant");
- QSignalSpy spy(&panel, SIGNAL(settingChanged(QString,QVariant)));
- QFETCH(int, value);
- QFETCH(bool, setOnObject);
- if (setOnObject)
- {
- spinBox.setValue(value);
- }
- else
- {
- panel.setSetting("property", QVariant(value));
- }
- QFETCH(int, expectedSettingChangedCount);
- QCOMPARE(spy.count(), expectedSettingChangedCount);
- QFETCH(QStringList, expectedChangedSettings);
- QCOMPARE(panel.changedSettings(), expectedChangedSettings);
- // make sure it didn't change
- QCOMPARE(panel.settingLabel("property"), label);
- QCOMPARE(panel.settingOptions("property"), options);
-
- QString currentSettingContent;
- {
- settings.sync();
- if (QFile::exists(settings.fileName()))
- {
- QFile file(settings.fileName());
- QVERIFY(file.open(QIODevice::ReadOnly));
- currentSettingContent = file.readAll();
- file.close();
- }
- }
-
- QString currentSpecificSettingsContent;
- {
- specificSettings.sync();
- if (QFile::exists(specificSettings.fileName()))
- {
- QFile file(specificSettings.fileName());
- QVERIFY(file.open(QIODevice::ReadOnly));
- currentSpecificSettingsContent = file.readAll();
- file.close();
- }
- }
- QString expectedSettingsContent = QLatin1String("[General]\nproperty=%1\n");
-
- if (expectedChangedSettings.count() > 0)
- {
- if (registerSpecificSettings)
- {
- QCOMPARE(currentSettingContent, QString(""));
- QCOMPARE(currentSpecificSettingsContent, expectedSettingsContent.arg(value));
- }
- else
- {
- QCOMPARE(currentSettingContent, expectedSettingsContent.arg(value));
- QCOMPARE(currentSpecificSettingsContent, QString(""));
- }
- }
- else
- {
- if (registerSpecificSettings)
- {
- QCOMPARE(currentSettingContent, QString(""));
- QCOMPARE(currentSpecificSettingsContent, expectedSettingsContent.arg(1));
- }
- else
- {
- QCOMPARE(currentSettingContent, expectedSettingsContent.arg(1));
- QCOMPARE(currentSpecificSettingsContent, QString(""));
- }
- }
- panel.resetSettings();
- }
- //-----------------------------------------------------------------------------
- void ctkSettingsPanelTester::testChangeProperty_data()
- {
- QTest::addColumn<QString>("label");
- QTest::addColumn<ctkSettingsPanel::SettingOptions>("options");
- QTest::addColumn<int>("value");
- QTest::addColumn<bool>("setOnObject");
- QTest::addColumn<bool>("registerSpecificSettings");
- QTest::addColumn<int>("expectedSettingChangedCount");
- QTest::addColumn<QStringList>("expectedChangedSettings");
- // registerSpecificSettings: false
- QTest::newRow("null none changed obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << false << 1 << QStringList("property");
- QTest::newRow("null none changed panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << false << 1 << QStringList("property");
- QTest::newRow("null none unchanged obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << false << 0 << QStringList();
- QTest::newRow("null none unchanged panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << false << 0 << QStringList();
- QTest::newRow("null RequireRestart changed obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << false << 1 << QStringList("property");
- QTest::newRow("null RequireRestart changed panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << false << 1 << QStringList("property");
- QTest::newRow("null RequireRestart unchanged obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << false << 0 << QStringList();
- QTest::newRow("null RequireRestart unchanged panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << false << 0 << QStringList();
- QTest::newRow("empty none changed obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << false << 1 << QStringList("property");
- QTest::newRow("empty none changed panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << false << 1 << QStringList("property");
- QTest::newRow("empty none unchanged obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << false << 0 << QStringList();
- QTest::newRow("empty none unchanged panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << false << 0 << QStringList();
- QTest::newRow("empty RequireRestart changed obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << false << 1 << QStringList("property");
- QTest::newRow("empty RequireRestart changed panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << false << 1 << QStringList("property");
- QTest::newRow("empty RequireRestart unchanged obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << false << 0 << QStringList();
- QTest::newRow("empty RequireRestart unchanged panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << false << 0 << QStringList();
- QTest::newRow("label none changed obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << false << 1 << QStringList("property");
- QTest::newRow("label none changed panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << false << 1 << QStringList("property");
- QTest::newRow("label none unchanged obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << false << 0 << QStringList();
- QTest::newRow("label none unchanged panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << false << 0 << QStringList();
- QTest::newRow("label RequireRestart changed obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << false << 1 << QStringList("property");
- QTest::newRow("label RequireRestart changed panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << false << 1 << QStringList("property");
- QTest::newRow("label RequireRestart unchanged obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << false << 0 << QStringList();
- QTest::newRow("label RequireRestart unchanged panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << false << 0 << QStringList();
-
- // registerSpecificSettings: true
- QTest::newRow("null none changed obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << true << 1 << QStringList("property");
- QTest::newRow("null none changed panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << true << 1 << QStringList("property");
- QTest::newRow("null none unchanged obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << true << 0 << QStringList();
- QTest::newRow("null none unchanged panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << true << 0 << QStringList();
- QTest::newRow("null RequireRestart changed obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << true << 1 << QStringList("property");
- QTest::newRow("null RequireRestart changed panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << true << 1 << QStringList("property");
- QTest::newRow("null RequireRestart unchanged obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << true << 0 << QStringList();
- QTest::newRow("null RequireRestart unchanged panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << true << 0 << QStringList();
- QTest::newRow("empty none changed obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << true << 1 << QStringList("property");
- QTest::newRow("empty none changed panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << true << 1 << QStringList("property");
- QTest::newRow("empty none unchanged obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << true << 0 << QStringList();
- QTest::newRow("empty none unchanged panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << true << 0 << QStringList();
- QTest::newRow("empty RequireRestart changed obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << true << 1 << QStringList("property");
- QTest::newRow("empty RequireRestart changed panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << true << 1 << QStringList("property");
- QTest::newRow("empty RequireRestart unchanged obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << true << 0 << QStringList();
- QTest::newRow("empty RequireRestart unchanged panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << true << 0 << QStringList();
- QTest::newRow("label none changed obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << true << 1 << QStringList("property");
- QTest::newRow("label none changed panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << true << 1 << QStringList("property");
- QTest::newRow("label none unchanged obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << true << 0 << QStringList();
- QTest::newRow("label none unchanged panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << true << 0 << QStringList();
- QTest::newRow("label RequireRestart changed obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << true << 1 << QStringList("property");
- QTest::newRow("label RequireRestart changed panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << true << 1 << QStringList("property");
- QTest::newRow("label RequireRestart unchanged obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << true << 0 << QStringList();
- QTest::newRow("label RequireRestart unchanged panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << true << 0 << QStringList();
- }
- //-----------------------------------------------------------------------------
- void ctkSettingsPanelTester::testEmptyQStringList()
- {
- {
- // When QSettings goes out of scope, we are the settings file is up-to-date
- QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Common ToolKit", "CTK");
- settings.clear();
- settings.setValue("list", QVariant(QStringList()));
- }
- // Regression: Reading empty QStringList property from settings should be handled properly
- ctkSettingsPanel settingsPanel;
- ctkSettingsPanelTest2Helper * list = new ctkSettingsPanelTest2Helper(&settingsPanel);
- settingsPanel.registerProperty("list", list, "list", SIGNAL(listChanged()));
- QSettings settings2(QSettings::IniFormat, QSettings::UserScope, "Common ToolKit", "CTK");
- settingsPanel.setSettings(&settings2);
- }
- // ----------------------------------------------------------------------------
- CTK_TEST_MAIN(ctkSettingsPanelTest)
- #include "moc_ctkSettingsPanelTest.cpp"
|