diff options
Diffstat (limited to 'engines/testbed/testbed.cpp')
-rw-r--r-- | engines/testbed/testbed.cpp | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/engines/testbed/testbed.cpp b/engines/testbed/testbed.cpp new file mode 100644 index 0000000000..ef61cd7c13 --- /dev/null +++ b/engines/testbed/testbed.cpp @@ -0,0 +1,169 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#include "common/debug-channels.h" +#include "common/scummsys.h" +#include "common/system.h" + +#include "engines/util.h" + +#include "testbed/events.h" +#include "testbed/fs.h" +#include "testbed/graphics.h" +#include "testbed/misc.h" +#include "testbed/savegame.h" +#include "testbed/sound.h" +#include "testbed/testbed.h" + +namespace Testbed { + +void TestbedExitDialog::init() { + _xOffset = 25; + _yOffset = 0; + Common::String text = "Thank you for using ScummVM testbed! Here are yor summarized results:"; + addText(450, 20, text, Graphics::kTextAlignCenter, _xOffset, 15); + Common::Array<Common::String> strArray; + + for (Common::Array<Testsuite *>::const_iterator i = _testsuiteList.begin(); i != _testsuiteList.end(); ++i) { + strArray.push_back(Common::String::printf("%s (%d/%d tests failed)", (*i)->getName(), (*i)->getNumTestsFailed(), + (*i)->getNumTestsEnabled())); + } + + addList(0, _yOffset, 500, 200, strArray); + text = "More Details can be viewed in the Log file : " + Testsuite::getLogFile(); + addText(450, 20, text, Graphics::kTextAlignLeft, 0, 0); + text = "Directory : " + Testsuite::getLogDir(); + addText(500, 20, text, Graphics::kTextAlignLeft, 0, 0); + _yOffset += 5; + addButtonXY(_xOffset + 80, _yOffset, 120, 20, "Rerun Tests", kCmdRerunTestbed); + addButtonXY(_xOffset + 240, _yOffset, 60, 20, "Close", GUI::kCloseCmd); +} + +void TestbedExitDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) { + switch (cmd) { + case kCmdRerunTestbed : + _rerun = true; + GUI::Dialog::close(); + default: + GUI::Dialog::handleCommand(sender, cmd, data); + } +} + +bool TestbedEngine::hasFeature(EngineFeature f) const { + return (f == kSupportsRTL) ? true : false; +} + +TestbedEngine::TestbedEngine(OSystem *syst) + : Engine(syst) { + // Put your engine in a sane state, but do nothing big yet; + // in particular, do not load data from files; rather, if you + // need to do such things, do them from init(). + + // Do not initialize graphics here + + // However this is the place to specify all default directories + + DebugMan.addDebugChannel(kTestbedLogOutput, "LOG", "Log of test results generated by testbed"); + DebugMan.addDebugChannel(kTestbedEngineDebug, "Debug", "Engine-specific debug statements"); + DebugMan.enableDebugChannel("LOG"); + + // Initialize testsuites here + // GFX + Testsuite *ts = new GFXTestSuite(); + _testsuiteList.push_back(ts); + // FS + ts = new FSTestSuite(); + _testsuiteList.push_back(ts); + // Savegames + ts = new SaveGameTestSuite(); + _testsuiteList.push_back(ts); + // Misc. + ts = new MiscTestSuite(); + _testsuiteList.push_back(ts); + // Events + ts = new EventTestSuite(); + _testsuiteList.push_back(ts); + // Sound + ts = new SoundSubsystemTestSuite(); + _testsuiteList.push_back(ts); +} + +TestbedEngine::~TestbedEngine() { + Testsuite::deleteWriteStream(); + // Remove all of our debug levels here + DebugMan.clearAllDebugChannels(); + + for (Common::Array<Testsuite *>::const_iterator i = _testsuiteList.begin(); i != _testsuiteList.end(); ++i) { + delete (*i); + } +} + +void TestbedEngine::invokeTestsuites(TestbedConfigManager &cfMan) { + Common::Array<Testsuite *>::const_iterator iter; + uint count = 1; + Common::Point pt = Testsuite::getDisplayRegionCoordinates(); + int numSuitesEnabled = cfMan.getNumSuitesEnabled(); + + for (iter = _testsuiteList.begin(); iter != _testsuiteList.end(); iter++) { + (*iter)->reset(); + if ((*iter)->isEnabled()) { + Testsuite::updateStats("Testsuite", (*iter)->getName(), count++, numSuitesEnabled, pt); + (*iter)->execute(); + } + } +} + +Common::Error TestbedEngine::run() { + // Initialize graphics using following: + initGraphics(320, 200, false); + + // As of now we are using GUI::MessageDialog for interaction, Test if it works. + // interactive mode could also be modified by a config parameter "non-interactive=1" + // TODO: Implement that + + TestbedConfigManager cfMan(_testsuiteList, "testbed.config"); + + // Keep running if rerun requested + TestbedExitDialog tbDialog(_testsuiteList); + + do { + Testsuite::clearEntireScreen(); + cfMan.selectTestsuites(); + // Init logging + Testsuite::initLogging(true); + // Check if user wanted to exit. + if (Engine::shouldQuit()) { + return Common::kNoError; + } + + invokeTestsuites(cfMan); + tbDialog.init(); + tbDialog.run(); + + } while (tbDialog.rerunRequired()); + + return Common::kNoError; +} + +} // End of namespace Testbed |