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 /Swift/Controllers/Settings
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.
Diffstat (limited to 'Swift/Controllers/Settings')
-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
7 files changed, 138 insertions, 10 deletions
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
@@ -39,11 +39,18 @@ class DummySettingsProvider : public SettingsProvider {
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
@@ -55,6 +55,7 @@ class SettingsProvider {
bool getIsSettingFinal(const Setting<T>& setting) {
return getIsSettingFinal(setting.getKey());
}
+ virtual bool hasSetting(const std::string& key) = 0;
friend class SettingsProviderHierachy;
protected:
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
@@ -13,14 +13,27 @@ 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) {
@@ -30,13 +43,17 @@ void SettingsProviderHierachy::storeSetting(const Setting<std::string>& setting,
}
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) {
@@ -46,13 +63,17 @@ void SettingsProviderHierachy::storeSetting(const Setting<bool>& setting, const
}
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) {
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
@@ -22,6 +22,7 @@ class SettingsProviderHierachy : public SettingsProvider {
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);
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
@@ -36,6 +36,11 @@ 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()];
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
@@ -27,6 +27,8 @@ class XMLSettingsProvider : public SettingsProvider, public XMLParserClient {
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);