From 89988af11ddf2feb0a028230d544b39c5cdc96bd Mon Sep 17 00:00:00 2001 From: Neeraj Kumar Date: Sat, 24 Jul 2010 21:02:21 +0000 Subject: TESTBED: reimplemented the config functionality using ConfigFile Class svn-id: r51258 --- engines/testbed/config.cpp | 201 ++++++++++++++++--------------------------- engines/testbed/config.h | 7 +- engines/testbed/graphics.cpp | 2 +- 3 files changed, 79 insertions(+), 131 deletions(-) (limited to 'engines') diff --git a/engines/testbed/config.cpp b/engines/testbed/config.cpp index 21f4bd121b..5226b63eb3 100644 --- a/engines/testbed/config.cpp +++ b/engines/testbed/config.cpp @@ -30,17 +30,6 @@ namespace Testbed { -/** - * Stores testbed setting to be accessed/modified from config file. - * As of now there is only one entry "isSessionInteractive" - */ -struct TestbedSettings { - const char *name; - bool value; -} testbedSettings[] = { - {"isSessionInteractive", true} -}; - TestbedOptionsDialog::TestbedOptionsDialog(Common::Array &tsList, TestbedConfigManager *tsConfMan) : GUI::Dialog("Browser"), _testbedConfMan(tsConfMan) { new GUI::StaticTextWidget(this, "Browser.Headline", "Select Testsuites to Execute"); @@ -49,12 +38,14 @@ TestbedOptionsDialog::TestbedOptionsDialog(Common::Array &tsList, T // Construct a String Array Common::Array::const_iterator iter; Common::String description; + uint selected = 0; for (iter = tsList.begin(); iter != tsList.end(); iter++) { _testSuiteArray.push_back(*iter); description = (*iter)->getDescription(); if ((*iter)->isEnabled()) { _testSuiteDescArray.push_back(description + "(selected)"); + selected++; _colors.push_back(GUI::ThemeEngine::kFontColorNormal); } else { _testSuiteDescArray.push_back(description); @@ -69,7 +60,11 @@ TestbedOptionsDialog::TestbedOptionsDialog(Common::Array &tsList, T // This list shouldn't be editable _testListDisplay->setEditable(false); - _selectButton = new GUI::ButtonWidget(this, "Browser.Up", "Deselect All", kTestbedDeselectAll, 0); + if (selected > (tsList.size() - selected)) { + _selectButton = new GUI::ButtonWidget(this, "Browser.Up", "Deselect All", kTestbedDeselectAll, 0); + } else { + _selectButton = new GUI::ButtonWidget(this, "Browser.Up", "Select All", kTestbedSelectAll, 0); + } new GUI::ButtonWidget(this, "Browser.Cancel", "Run tests", GUI::kCloseCmd); new GUI::ButtonWidget(this, "Browser.Choose", "Exit Testbed", kTestbedQuitCmd); } @@ -132,28 +127,55 @@ void TestbedOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, } } -void TestbedConfigManager::writeTestbedConfigToStream(Common::WriteStream *ws) { +void TestbedConfigManager::initConfigFile(Common::WriteStream *ws) { Common::String wStr; - for (Common::Array::const_iterator i = _testsuiteList.begin(); i < _testsuiteList.end(); i++) { + // Global Params + wStr = "[Global]\n"; + ws->writeString(wStr); + wStr = "isSessionInteractive"; + wStr += "="; + wStr += "true\n"; + ws->writeString(wStr); + ws->writeString("\n"); + + for (Common::Array::const_iterator i = _testsuiteList.begin(); i < _testsuiteList.end(); i++) { // Construct the string wStr = "["; wStr += (*i)->getName(); - wStr += " = "; - wStr += (*i)->isEnabled() ? "true" : "false"; wStr += "]\n"; ws->writeString(wStr); - // TODO : for every test + wStr = "this"; + wStr += "="; + wStr += boolToString((*i)->isEnabled()); + wStr += "\n"; + ws->writeString(wStr); + const Common::Array &testList = (*i)->getTestList(); for (Common::Array::const_iterator j = testList.begin(); j != testList.end(); j++) { wStr = (*j)->featureName; - wStr += " = "; - wStr += (*j)->enabled ? "true\n": "false\n"; + wStr += "="; + wStr += boolToString((*j)->enabled); + wStr += "\n"; ws->writeString(wStr); } ws->writeString("\n"); } } +void TestbedConfigManager::writeTestbedConfigToStream(Common::WriteStream *ws) { + Common::String wStr; + for (Common::Array::const_iterator i = _testsuiteList.begin(); i < _testsuiteList.end(); i++) { + if (_configFileInterface.hasSection((*i)->getName())) { + _configFileInterface.setKey("this", (*i)->getName(), boolToString((*i)->isEnabled())); + const Common::Array &testList = (*i)->getTestList(); + for (Common::Array::const_iterator j = testList.begin(); j != testList.end(); j++) { + _configFileInterface.setKey((*j)->featureName, (*i)->getName(), boolToString((*j)->enabled)); + } + } + } + _configFileInterface.saveToStream(*ws); +} + Common::SeekableReadStream *TestbedConfigManager::getConfigReadStream() { // Look for config file in game-path const Common::String &path = ConfMan.get("path"); @@ -165,122 +187,54 @@ Common::SeekableReadStream *TestbedConfigManager::getConfigReadStream() { Common::WriteStream *TestbedConfigManager::getConfigWriteStream() { // Look for config file in game-path const Common::String &path = ConfMan.get("path"); + Common::WriteStream *ws; Common::FSNode gameRoot(path); Common::FSNode config = gameRoot.getChild(_configFileName); + ws = config.createWriteStream(); if (!config.exists()) { - Testsuite::logPrintf("Info! No config file found, creating new one"); - } - return config.createWriteStream(); -} - -void TestbedConfigManager::editSettingParam(Common::String param, bool value) { - for (int i = 0; i < ARRAYSIZE(testbedSettings); i++) { - if (param.equalsIgnoreCase(testbedSettings[i].name)) { - testbedSettings[i].value = value; - } + Testsuite::logPrintf("Info! No config file found, creating new one\n"); + initConfigFile(ws); } + return ws; } void TestbedConfigManager::parseConfigFile() { Common::SeekableReadStream *rs = getConfigReadStream(); + if (!rs) { Testsuite::logPrintf("Info! No config file found, using default configuration.\n"); return; } + _configFileInterface.loadFromStream(*rs); + Common::ConfigFile::SectionList sections = _configFileInterface.getSections(); Testsuite *currTS = 0; - bool globalSettings = true; - - int lineno = 0; - while (!rs->eos() && !rs->err()) { - Common::String line = rs->readLine(); - lineno++; - // Trim leading / trailing whitespaces - line.trim(); - - if (0 ==line.size() || '#' == line[0]) { - // Skip blank lines and comments - continue; - } - if (line.contains("[Global]") || line.contains("[global]")) { - // Global settings. - globalSettings = true; - continue; - } - - if (globalSettings) { - const char* t = line.c_str(); - const char *p = strchr(t, '='); - Common::String key(t, p); - Common::String value(p + 1); - // trim both of spaces - key.trim(); - value.trim(); - if (value.equalsIgnoreCase("true")) { - editSettingParam(key, true); - } else { - editSettingParam(key, false); - } - continue; - } - - // Check testsuites first - if ('[' == line[0]) { - // This is a testsuite, extract key value - const char* t = line.c_str() + 1; - const char *p = strchr(t, '='); - - if (!p) { - Testsuite::logPrintf("Error! Parsing : Malformed config file, token '=' missing at line %d\n", lineno); - break; - } - - Common::String tsName(t, p); - Common::String toEnable(p + 1); - // trim both of spaces - tsName.trim(); - toEnable.trim(); - - currTS = getTestsuiteByName(tsName); - globalSettings = false; - if (!currTS) { - Testsuite::logPrintf("Error! Parsing : Unrecognized testsuite name at line %d\n", lineno); - break; - } - toEnable.toLowercase(); - if (toEnable.contains("true")) { - currTS->enable(true); - } else { - currTS->enable(false); - } + for (Common::ConfigFile::SectionList::const_iterator i = sections.begin(); i != sections.end(); i++) { + if (i->name.equalsIgnoreCase("Global")) { + // Global params may be directly queried, ignore them } else { - // A test under "currTS" testsuite + // A testsuite, process it. + currTS = getTestsuiteByName(i->name); + Common::ConfigFile::SectionKeyList kList = i->getKeys(); if (!currTS) { - Testsuite::logPrintf("Error! Parsing : Malformed config file, No testsuite corresponding to test at line %d\n", lineno); - break; - } - // Extract key value - const char* t = line.c_str(); - const char *p = strchr(t, '='); - Common::String key(t, p); - Common::String value(p + 1); - // trim both of spaces - key.trim(); - value.trim(); - bool isValid = true; - if (value.equalsIgnoreCase("true")) { - isValid = currTS->enableTest(key, true); - } else { - isValid = currTS->enableTest(key, false); + Testsuite::logPrintf("Warning! Error in config: Testsuite %s not found\n", i->name.c_str()); } - if (!isValid) { - Testsuite::logPrintf("Error! Parsing : Unrecognized test for testsuite %s at line %d\n", currTS->getName(), lineno); + + for (Common::ConfigFile::SectionKeyList::const_iterator j = kList.begin(); j != kList.end(); j++) { + if (j->key.equalsIgnoreCase("this")) { + currTS->enable(stringToBool(j->value)); + } else { + if (!currTS->enableTest(j->key, stringToBool(j->value))) { + Testsuite::logPrintf("Warning! Error in config: Test %s not found\n", j->key.c_str()); + } + } } } } delete rs; } + Testsuite *TestbedConfigManager::getTestsuiteByName(const Common::String &name) { for (uint i = 0; i < _testsuiteList.size(); i++) { if (name.equalsIgnoreCase(_testsuiteList[i]->getName())) { @@ -290,25 +244,16 @@ Testsuite *TestbedConfigManager::getTestsuiteByName(const Common::String &name) return 0; } -bool TestbedConfigManager::getConfigParamValue(const Common::String param) { - for (int i = 0; i < ARRAYSIZE(testbedSettings); i++) { - if (param.equalsIgnoreCase(testbedSettings[i].name)) { - return testbedSettings[i].value; - } - } - return false; -} - void TestbedConfigManager::selectTestsuites() { - - // Parse the config file - // Enable testsuites as per configuration. - // If no config file is found pickup a default configuration. - // TODO : Implement this method - parseConfigFile(); - Testsuite::isSessionInteractive = getConfigParamValue("isSessionInteractive"); + + if (_configFileInterface.hasKey("isSessionInteractive", "Global")) { + Common::String in; + _configFileInterface.getKey("isSessionInteractive", "Global", in); + Testsuite::isSessionInteractive = stringToBool(in); + } + if (!Testsuite::isSessionInteractive) { // Non interactive sessions don't need to go beyond return; diff --git a/engines/testbed/config.h b/engines/testbed/config.h index 42320bbee8..8fbed858d1 100644 --- a/engines/testbed/config.h +++ b/engines/testbed/config.h @@ -27,6 +27,7 @@ #include "common/array.h" +#include "common/config-file.h" #include "common/str-array.h" #include "common/tokenizer.h" @@ -56,12 +57,14 @@ public: Common::WriteStream *getConfigWriteStream(); void writeTestbedConfigToStream(Common::WriteStream *ws); Testsuite *getTestsuiteByName(const Common::String &name); - bool getConfigParamValue(const Common::String param); + bool stringToBool(const Common::String str) { return str.equalsIgnoreCase("true") ? true : false; } + Common::String boolToString(bool val) { return val ? "true" : "false"; } + void initConfigFile(Common::WriteStream *ws); private: Common::Array &_testsuiteList; Common::String _configFileName; + Common::ConfigFile _configFileInterface; void parseConfigFile(); - void editSettingParam(Common::String param, bool value); }; class TestbedListWidget : public GUI::ListWidget { diff --git a/engines/testbed/graphics.cpp b/engines/testbed/graphics.cpp index 4cbe963031..88e44b8d0a 100644 --- a/engines/testbed/graphics.cpp +++ b/engines/testbed/graphics.cpp @@ -599,7 +599,7 @@ bool GFXtests::mouseMovements() { Common::String info = "Testing Automated Mouse movements.\n" "You should expect cursor hotspot(top-left corner) to automatically move from (0, 0) to (100, 100).\n" - "There we have a rectangle drawn, finally the rectangle should symmetrically contain the cursor."; + "There we have a rectangle drawn, finally the cursor would lie centred in that rectangle."; if (Testsuite::handleInteractiveInput(info, "OK", "Skip", kOptionRight)) { Testsuite::logPrintf("Info! Skipping test : Mouse Movements"); -- cgit v1.2.3