summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Smith <git@kismith.co.uk>2012-03-01 08:03:50 (GMT)
committerKevin Smith <git@kismith.co.uk>2012-03-03 09:00:30 (GMT)
commitfde71bd59b1412ae475c06f2d4100ce088e86af6 (patch)
tree4f3d85c700942d666c5ac5d032c757bc45bb1593
parent5271144cb6c0ecf3dc237af25197fa72a8737c09 (diff)
downloadswift-contrib-fde71bd59b1412ae475c06f2d4100ce088e86af6.zip
swift-contrib-fde71bd59b1412ae475c06f2d4100ce088e86af6.tar.bz2
Unit tests for SettingsProviderHierachy
Also fixing up errors they found and an uninitialised read left-over from the original patch.
-rw-r--r--Swift/Controllers/Chat/ChatsManager.cpp2
-rw-r--r--Swift/Controllers/SConscript1
-rw-r--r--Swift/Controllers/Settings/DummySettingsProvider.h9
-rw-r--r--Swift/Controllers/Settings/SettingsProvider.h1
-rw-r--r--Swift/Controllers/Settings/SettingsProviderHierachy.cpp39
-rw-r--r--Swift/Controllers/Settings/SettingsProviderHierachy.h1
-rw-r--r--Swift/Controllers/Settings/UnitTest/SettingsProviderHierachyTest.cpp91
-rw-r--r--Swift/Controllers/Settings/XMLSettingsProvider.cpp5
-rw-r--r--Swift/Controllers/Settings/XMLSettingsProvider.h2
-rw-r--r--Swift/QtUI/QtSettingsProvider.cpp5
-rw-r--r--Swift/QtUI/QtSettingsProvider.h1
-rw-r--r--Swiften/Client/CoreClient.h2
12 files changed, 147 insertions, 12 deletions
diff --git a/Swift/Controllers/Chat/ChatsManager.cpp b/Swift/Controllers/Chat/ChatsManager.cpp
index dcbba34..aedee4c 100644
--- a/Swift/Controllers/Chat/ChatsManager.cpp
+++ b/Swift/Controllers/Chat/ChatsManager.cpp
@@ -107,18 +107,20 @@ ChatsManager::ChatsManager(
mucSearchController_->onMUCSelected.connect(boost::bind(&ChatsManager::handleMUCSelectedAfterSearch, this, _1));
ftOverview_->onNewFileTransferController.connect(boost::bind(&ChatsManager::handleNewFileTransferController, this, _1));
roster_->onJIDAdded.connect(boost::bind(&ChatsManager::handleJIDAddedToRoster, this, _1));
roster_->onJIDRemoved.connect(boost::bind(&ChatsManager::handleJIDRemovedFromRoster, this, _1));
roster_->onJIDUpdated.connect(boost::bind(&ChatsManager::handleJIDUpdatedInRoster, this, _1));
roster_->onRosterCleared.connect(boost::bind(&ChatsManager::handleRosterCleared, this));
settings_->onSettingChanged.connect(boost::bind(&ChatsManager::handleSettingChanged, this, _1));
+ userWantsReceipts_ = settings_->getSetting(SettingConstants::REQUEST_DELIVERYRECEIPTS);
+
setupBookmarks();
loadRecents();
}
ChatsManager::~ChatsManager() {
settings_->onSettingChanged.disconnect(boost::bind(&ChatsManager::handleSettingChanged, this, _1));
roster_->onJIDAdded.disconnect(boost::bind(&ChatsManager::handleJIDAddedToRoster, this, _1));
roster_->onJIDRemoved.disconnect(boost::bind(&ChatsManager::handleJIDRemovedFromRoster, this, _1));
roster_->onJIDUpdated.disconnect(boost::bind(&ChatsManager::handleJIDUpdatedInRoster, this, _1));
diff --git a/Swift/Controllers/SConscript b/Swift/Controllers/SConscript
index 02e212b..70085a6 100644
--- a/Swift/Controllers/SConscript
+++ b/Swift/Controllers/SConscript
@@ -78,10 +78,11 @@ if env["SCONS_STAGE"] == "build" :
File("Roster/UnitTest/RosterTest.cpp"),
File("Roster/UnitTest/LeastCommonSubsequenceTest.cpp"),
File("Roster/UnitTest/TableRosterTest.cpp"),
File("UnitTest/PreviousStatusStoreTest.cpp"),
File("UnitTest/PresenceNotifierTest.cpp"),
File("Chat/UnitTest/ChatsManagerTest.cpp"),
File("Chat/UnitTest/MUCControllerTest.cpp"),
File("UnitTest/MockChatWindow.cpp"),
File("UnitTest/ChatMessageSummarizerTest.cpp"),
+ File("Settings/UnitTest/SettingsProviderHierachyTest.cpp"),
])
diff --git a/Swift/Controllers/Settings/DummySettingsProvider.h b/Swift/Controllers/Settings/DummySettingsProvider.h
index bb7d2e6..1d6059f 100644
--- a/Swift/Controllers/Settings/DummySettingsProvider.h
+++ b/Swift/Controllers/Settings/DummySettingsProvider.h
@@ -33,20 +33,27 @@ class DummySettingsProvider : public SettingsProvider {
return intValues.find(setting.getKey()) != intValues.end() ? intValues[setting.getKey()] : setting.getDefaultValue();
};
virtual void storeSetting(const Setting<int>& setting, const int& value) {
intValues[setting.getKey()] = value;
onSettingChanged(setting.getKey());
};
virtual std::vector<std::string> getAvailableProfiles() {return std::vector<std::string>();}
virtual void createProfile(const std::string& ) {}
virtual void removeProfile(const std::string& ) {}
- virtual bool getIsSettingFinal(const std::string& ) {return false;}
+ virtual bool getIsSettingFinal(const std::string& settingPath) {return finals.count(settingPath);}
+ void setFinal(const std::string& settingPath) {
+ finals.insert(settingPath);
+ }
+ virtual bool hasSetting(const std::string& key) {
+ return stringValues.find(key) != stringValues.end() || intValues.find(key) != intValues.end() || boolValues.find(key) != boolValues.end();
+ }
private:
std::map<std::string, std::string> stringValues;
std::map<std::string, int> intValues;
std::map<std::string, bool> boolValues;
+ std::set<std::string> finals;
};
}
diff --git a/Swift/Controllers/Settings/SettingsProvider.h b/Swift/Controllers/Settings/SettingsProvider.h
index e884add..458653b 100644
--- a/Swift/Controllers/Settings/SettingsProvider.h
+++ b/Swift/Controllers/Settings/SettingsProvider.h
@@ -49,18 +49,19 @@ class SettingsProvider {
virtual void createProfile(const std::string& profile) = 0;
virtual void removeProfile(const std::string& profile) = 0;
/** A final setting is one that this settings provider says may not be overriden by lower priority profiles.
* e.g. An Administrator-set configuration to disallow saving user passwords could not be overridden by the user.
*/
template<typename T>
bool getIsSettingFinal(const Setting<T>& setting) {
return getIsSettingFinal(setting.getKey());
}
+ virtual bool hasSetting(const std::string& key) = 0;
friend class SettingsProviderHierachy;
protected:
virtual bool getIsSettingFinal(const std::string& settingPath) = 0;
public:
/**
* Emitted when a setting is changed.
*/
diff --git a/Swift/Controllers/Settings/SettingsProviderHierachy.cpp b/Swift/Controllers/Settings/SettingsProviderHierachy.cpp
index 3b7d13c..40a9025 100644
--- a/Swift/Controllers/Settings/SettingsProviderHierachy.cpp
+++ b/Swift/Controllers/Settings/SettingsProviderHierachy.cpp
@@ -7,58 +7,79 @@
#include <Swift/Controllers/Settings/SettingsProviderHierachy.h>
#include <Swiften/Base/foreach.h>
#include <Swiften/Base/Log.h>
namespace Swift {
SettingsProviderHierachy::~SettingsProviderHierachy() {
}
+bool SettingsProviderHierachy::hasSetting(const std::string& key) {
+ foreach (SettingsProvider* provider, providers_) {
+ if (provider->hasSetting(key)) {
+ return true;
+ }
+ }
+ return false;
+}
+
std::string SettingsProviderHierachy::getSetting(const Setting<std::string>& setting) {
+ std::string value = setting.getDefaultValue();
foreach (SettingsProvider* provider, providers_) {
std::string providerSetting = provider->getSetting(setting);
- if (providerSetting != setting.getDefaultValue()) {
- return providerSetting;
+ if (provider->hasSetting(setting.getKey())) {
+ value = providerSetting;
+ }
+ if (provider->getIsSettingFinal(setting.getKey())) {
+ return value;
}
}
- return setting.getDefaultValue();
+ return value;
}
void SettingsProviderHierachy::storeSetting(const Setting<std::string>& setting, const std::string& settingValue) {
if (!getIsSettingFinal(setting.getKey())) {
getWritableProvider()->storeSetting(setting, settingValue);
}
}
bool SettingsProviderHierachy::getSetting(const Setting<bool>& setting) {
+ bool value = setting.getDefaultValue();
foreach (SettingsProvider* provider, providers_) {
bool providerSetting = provider->getSetting(setting);
- if (providerSetting != setting.getDefaultValue()) {
- return providerSetting;
+ if (provider->hasSetting(setting.getKey())) {
+ value = providerSetting;
+ if (provider->getIsSettingFinal(setting.getKey())) {
+ return providerSetting;
+ }
}
}
- return setting.getDefaultValue();
+ return value;
}
void SettingsProviderHierachy::storeSetting(const Setting<bool>& setting, const bool& settingValue) {
if (!getIsSettingFinal(setting.getKey())) {
getWritableProvider()->storeSetting(setting, settingValue);
}
}
int SettingsProviderHierachy::getSetting(const Setting<int>& setting) {
+ int value = setting.getDefaultValue();
foreach (SettingsProvider* provider, providers_) {
int providerSetting = provider->getSetting(setting);
- if (providerSetting != setting.getDefaultValue()) {
- return providerSetting;
+ if (provider->hasSetting(setting.getKey())) {
+ value = providerSetting;
+ if (provider->getIsSettingFinal(setting.getKey())) {
+ return providerSetting;
+ }
}
}
- return setting.getDefaultValue();
+ return value;
}
void SettingsProviderHierachy::storeSetting(const Setting<int>& setting, const int& settingValue) {
if (!getIsSettingFinal(setting.getKey())) {
getWritableProvider()->storeSetting(setting, settingValue);
}
}
std::vector<std::string> SettingsProviderHierachy::getAvailableProfiles() {
diff --git a/Swift/Controllers/Settings/SettingsProviderHierachy.h b/Swift/Controllers/Settings/SettingsProviderHierachy.h
index b7f6961..b16b33e 100644
--- a/Swift/Controllers/Settings/SettingsProviderHierachy.h
+++ b/Swift/Controllers/Settings/SettingsProviderHierachy.h
@@ -16,18 +16,19 @@ class SettingsProviderHierachy : public SettingsProvider {
virtual std::string getSetting(const Setting<std::string>& setting);
virtual void storeSetting(const Setting<std::string>& setting, const std::string& value);
virtual bool getSetting(const Setting<bool>& setting);
virtual void storeSetting(const Setting<bool>& setting, const bool& value);
virtual int getSetting(const Setting<int>& setting);
virtual void storeSetting(const Setting<int>& setting, const int& value);
virtual std::vector<std::string> getAvailableProfiles();
virtual void createProfile(const std::string& profile);
virtual void removeProfile(const std::string& profile);
+ virtual bool hasSetting(const std::string& key);
protected:
virtual bool getIsSettingFinal(const std::string& settingPath);
public:
/**
* Adds a provider less significant than any already added.
* This means that if an existing provider has a setting, this provider won't be asked.
* Any settings will be pushed into the topmost (least significant) provider.
* Does not take ownership of provider.
diff --git a/Swift/Controllers/Settings/UnitTest/SettingsProviderHierachyTest.cpp b/Swift/Controllers/Settings/UnitTest/SettingsProviderHierachyTest.cpp
new file mode 100644
index 0000000..aa4d14f
--- /dev/null
+++ b/Swift/Controllers/Settings/UnitTest/SettingsProviderHierachyTest.cpp
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2012 Kevin Smith
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+
+#include <Swift/Controllers/Settings/SettingsProviderHierachy.h>
+#include <Swift/Controllers/Settings/DummySettingsProvider.h>
+#include <Swift/Controllers/Settings/XMLSettingsProvider.h>
+
+using namespace Swift;
+using namespace std;
+
+class SettingsProviderHierachyTest : public CppUnit::TestFixture {
+ CPPUNIT_TEST_SUITE(SettingsProviderHierachyTest);
+ CPPUNIT_TEST(testEmpty);
+ CPPUNIT_TEST(testTop);
+ CPPUNIT_TEST(testBottom);
+ CPPUNIT_TEST(testBoth);
+ CPPUNIT_TEST(testTopDefault);
+ CPPUNIT_TEST(testBottomOverrides);
+ CPPUNIT_TEST(testFinal);
+ CPPUNIT_TEST_SUITE_END();
+
+public:
+ SettingsProviderHierachyTest() : setting1("somekey", 42) {};
+
+ void setUp() {
+ bottom = new DummySettingsProvider();
+ top = new DummySettingsProvider();
+ testling = new SettingsProviderHierachy();
+ testling->addProviderToTopOfStack(bottom);
+ testling->addProviderToTopOfStack(top);
+ }
+
+ void tearDown() {
+ delete testling;
+ delete top;
+ delete bottom;
+ }
+
+ void testEmpty() {
+ CPPUNIT_ASSERT_EQUAL(42, testling->getSetting(setting1));
+ }
+
+ void testTop() {
+ top->storeSetting(setting1, 37);
+ CPPUNIT_ASSERT_EQUAL(37, testling->getSetting(setting1));
+ }
+
+ void testBottom() {
+ bottom->storeSetting(setting1, 17);
+ CPPUNIT_ASSERT_EQUAL(17, testling->getSetting(setting1));
+ }
+
+ void testBoth() {
+ bottom->storeSetting(setting1, 17);
+ top->storeSetting(setting1, 37);
+ CPPUNIT_ASSERT_EQUAL(37, testling->getSetting(setting1));
+ }
+
+ void testTopDefault() {
+ bottom->storeSetting(setting1, 17);
+ top->storeSetting(setting1, 42);
+ CPPUNIT_ASSERT_EQUAL(42, testling->getSetting(setting1));
+ }
+
+ void testBottomOverrides() {
+ bottom->storeSetting(setting1, 17);
+ bottom->setFinal(setting1.getKey());
+ top->storeSetting(setting1, 5);
+ CPPUNIT_ASSERT_EQUAL(17, testling->getSetting(setting1));
+ }
+
+ void testFinal() {
+ bottom->storeSetting(setting1, 17);
+ bottom->setFinal(setting1.getKey());
+ testling->storeSetting(setting1, 5);
+ CPPUNIT_ASSERT_EQUAL(17, testling->getSetting(setting1));
+ }
+private:
+ SettingsProviderHierachy* testling;
+ DummySettingsProvider* bottom;
+ DummySettingsProvider* top;
+ SettingsProvider::Setting<int> setting1;
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SettingsProviderHierachyTest);
diff --git a/Swift/Controllers/Settings/XMLSettingsProvider.cpp b/Swift/Controllers/Settings/XMLSettingsProvider.cpp
index 3710072..e83ed24 100644
--- a/Swift/Controllers/Settings/XMLSettingsProvider.cpp
+++ b/Swift/Controllers/Settings/XMLSettingsProvider.cpp
@@ -30,18 +30,23 @@ XMLSettingsProvider::XMLSettingsProvider(const std::string& xmlConfig) : level_(
else {
SWIFT_LOG(debug) << "No system config found" << std::endl;
}
}
XMLSettingsProvider::~XMLSettingsProvider() {
}
+bool XMLSettingsProvider::hasSetting(const std::string& key) {
+ return (values_.find(key) != values_.end());
+}
+
+
std::string XMLSettingsProvider::getSetting(const Setting<std::string>& setting) {
if (values_.find(setting.getKey()) != values_.end()) {
std::string value = values_[setting.getKey()];
return value;
}
return setting.getDefaultValue();
}
void XMLSettingsProvider::storeSetting(const Setting<std::string>& /*settingPath*/, const std::string& /*settingValue*/) {
diff --git a/Swift/Controllers/Settings/XMLSettingsProvider.h b/Swift/Controllers/Settings/XMLSettingsProvider.h
index 61abd11..e03d3c1 100644
--- a/Swift/Controllers/Settings/XMLSettingsProvider.h
+++ b/Swift/Controllers/Settings/XMLSettingsProvider.h
@@ -21,18 +21,20 @@ class XMLSettingsProvider : public SettingsProvider, public XMLParserClient {
virtual std::string getSetting(const Setting<std::string>& setting);
virtual void storeSetting(const Setting<std::string>& setting, const std::string& value);
virtual bool getSetting(const Setting<bool>& setting);
virtual void storeSetting(const Setting<bool>& setting, const bool& value);
virtual int getSetting(const Setting<int>& setting);
virtual void storeSetting(const Setting<int>& setting, const int& value);
virtual std::vector<std::string> getAvailableProfiles();
virtual void createProfile(const std::string& profile);
virtual void removeProfile(const std::string& profile);
+ virtual bool hasSetting(const std::string& key);
+
virtual void handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes);
virtual void handleEndElement(const std::string& element, const std::string& ns);
virtual void handleCharacterData(const std::string& data);
protected:
virtual bool getIsSettingFinal(const std::string& settingPath);
private:
std::map<std::string /*settingPath*/, std::string /*settingValue*/> values_;
diff --git a/Swift/QtUI/QtSettingsProvider.cpp b/Swift/QtUI/QtSettingsProvider.cpp
index 0c4d49b..64e88d4 100644
--- a/Swift/QtUI/QtSettingsProvider.cpp
+++ b/Swift/QtUI/QtSettingsProvider.cpp
@@ -12,18 +12,23 @@
namespace Swift {
QtSettingsProvider::QtSettingsProvider() {
}
QtSettingsProvider::~QtSettingsProvider() {
}
+bool QtSettingsProvider::hasSetting(const std::string& key) {
+ return !settings_.value(key.c_str()).isNull();
+}
+
+
std::string QtSettingsProvider::getSetting(const Setting<std::string>& setting) {
QVariant variant = settings_.value(setting.getKey().c_str());
return variant.isNull() ? setting.getDefaultValue() : std::string(variant.toString().toUtf8());
}
void QtSettingsProvider::storeSetting(const Setting<std::string>& setting, const std::string& settingValue) {
bool changed = false;
if (getSetting(setting) != settingValue) {
changed = true;
diff --git a/Swift/QtUI/QtSettingsProvider.h b/Swift/QtUI/QtSettingsProvider.h
index ececa6e..e85bfb5 100644
--- a/Swift/QtUI/QtSettingsProvider.h
+++ b/Swift/QtUI/QtSettingsProvider.h
@@ -19,18 +19,19 @@ class QtSettingsProvider : public SettingsProvider {
virtual std::string getSetting(const Setting<std::string>& setting);
virtual void storeSetting(const Setting<std::string>& setting, const std::string& value);
virtual bool getSetting(const Setting<bool>& setting);
virtual void storeSetting(const Setting<bool>& setting, const bool& value);
virtual int getSetting(const Setting<int>& setting);
virtual void storeSetting(const Setting<int>& setting, const int& value);
virtual std::vector<std::string> getAvailableProfiles();
virtual void createProfile(const std::string& profile);
virtual void removeProfile(const std::string& profile);
+ virtual bool hasSetting(const std::string& key);
QSettings* getQSettings();
protected:
virtual bool getIsSettingFinal(const std::string& settingPath);
private:
void updatePermissions();
private:
QSettings settings_;
diff --git a/Swiften/Client/CoreClient.h b/Swiften/Client/CoreClient.h
index 1b875d2..c9a6f30 100644
--- a/Swiften/Client/CoreClient.h
+++ b/Swiften/Client/CoreClient.h
@@ -196,20 +196,18 @@ namespace Swift {
NetworkFactories* getNetworkFactories() const {
return networkFactories;
}
/**
* Called before onConnected signal is emmitted.
*/
virtual void handleConnected() {};
- bool isCAPIURI();
-
private:
void handleConnectorFinished(boost::shared_ptr<Connection>);
void handleStanzaChannelAvailableChanged(bool available);
void handleSessionFinished(boost::shared_ptr<Error>);
void handleNeedCredentials();
void handleDataRead(const SafeByteArray&);
void handleDataWritten(const SafeByteArray&);
void handlePresenceReceived(boost::shared_ptr<Presence>);
void handleMessageReceived(boost::shared_ptr<Message>);