diff options
-rw-r--r-- | engines/testbed/events.cpp | 24 | ||||
-rw-r--r-- | engines/testbed/events.h | 1 | ||||
-rw-r--r-- | engines/testbed/graphics.cpp | 9 | ||||
-rw-r--r-- | engines/testbed/testbed.cpp | 7 | ||||
-rw-r--r-- | engines/testbed/testbed.h | 2 | ||||
-rw-r--r-- | engines/testbed/testsuite.cpp | 53 | ||||
-rw-r--r-- | engines/testbed/testsuite.h | 11 |
7 files changed, 96 insertions, 11 deletions
diff --git a/engines/testbed/events.cpp b/engines/testbed/events.cpp index e88c081d0d..6da5dd886b 100644 --- a/engines/testbed/events.cpp +++ b/engines/testbed/events.cpp @@ -25,6 +25,8 @@ #include "common/events.h" #include "common/keyboard.h" +#include "engines/engine.h" + #include "graphics/cursorman.h" #include "testbed/events.h" @@ -71,8 +73,15 @@ char EventTests::keystrokeToChar() { // handle all keybd events while (!quitLoop) { while (eventMan->pollEvent(event)) { + + // Quit if explicitly requested! + if (Engine::shouldQuit()) { + return 0; + } + switch (event.type) { case Common::EVENT_KEYDOWN : + if (event.kbd.keycode == Common::KEYCODE_ESCAPE) { return 0; } @@ -81,8 +90,9 @@ char EventTests::keystrokeToChar() { return keyCodeLUT[i].value; } } + break; default: - ; // Ignore other events + break; // Ignore other events } } } @@ -109,6 +119,10 @@ bool EventTests::mouseEvents() { g_system->updateScreen(); while (eventMan->pollEvent(event)) { + // Quit if explicitly requested + if (Engine::shouldQuit()) { + return passed; + } switch (event.type) { case Common::EVENT_MOUSEMOVE: // Movements havee already been tested in GFX @@ -190,9 +204,17 @@ bool EventTests::kbdEvents() { return true; } +bool EventTests::showMainMenu() { + Common::EventManager *eventMan = g_system->getEventManager(); + Common::Event mainMenuEvent; + mainMenuEvent.type = Common::EVENT_QUIT; + eventMan->pushEvent(mainMenuEvent); +} + EventTestSuite::EventTestSuite() { addTest("Mouse Events", &EventTests::mouseEvents); addTest("Keyboard Events", &EventTests::kbdEvents); + addTest("Mainmenu Event", &EventTests::showMainMenu); } const char *EventTestSuite::getName() const { return "Events"; diff --git a/engines/testbed/events.h b/engines/testbed/events.h index f39cf2f939..3effb2c260 100644 --- a/engines/testbed/events.h +++ b/engines/testbed/events.h @@ -37,6 +37,7 @@ char keystrokeToChar(); // will contain function declarations for Event tests bool mouseEvents(); bool kbdEvents(); +bool showMainMenu(); // add more here } diff --git a/engines/testbed/graphics.cpp b/engines/testbed/graphics.cpp index 51f4030dd0..a140d0ca14 100644 --- a/engines/testbed/graphics.cpp +++ b/engines/testbed/graphics.cpp @@ -26,6 +26,8 @@ #include "common/list.h" #include "common/random.h" +#include "engines/engine.h" + #include "testbed/graphics.h" #include "testbed/testsuite.h" @@ -190,7 +192,10 @@ void GFXtests::setupMouseLoop(bool disableCursorPalette, const char *gfxModeName while (!quitLoop) { while (eventMan->pollEvent(event)) { - + if (Engine::shouldQuit()) { + // Quit directly + return; + } if (lastRedraw + waitTime < g_system->getMillis()) { g_system->updateScreen(); lastRedraw = g_system->getMillis(); @@ -207,7 +212,7 @@ void GFXtests::setupMouseLoop(bool disableCursorPalette, const char *gfxModeName g_system->delayMillis(1000); break; default: - ;// Ignore any other event + break;// Ignore handling any other event } } diff --git a/engines/testbed/testbed.cpp b/engines/testbed/testbed.cpp index 2f5d63dd4f..d6bf92d08a 100644 --- a/engines/testbed/testbed.cpp +++ b/engines/testbed/testbed.cpp @@ -37,6 +37,10 @@ namespace Testbed { +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; @@ -128,10 +132,9 @@ Common::Error TestbedEngine::run() { // Enable the testsuites you want to execute // enableTestsuite("FS", true); - // enableTestsuite("GFX", true); + enableTestsuite("GFX", true); // enableTestsuite("savegames", true); // enableTestsuite("misc", true); - // enableTestsuite("misc", true); enableTestsuite("events", true); // invoke them invokeTestsuites(); diff --git a/engines/testbed/testbed.h b/engines/testbed/testbed.h index 7c45c5aa56..914e39dad6 100644 --- a/engines/testbed/testbed.h +++ b/engines/testbed/testbed.h @@ -54,6 +54,8 @@ public: */ void invokeTestsuites(); + bool hasFeature(EngineFeature f) const; + private: Common::Array<Testsuite*> _testsuiteList; }; diff --git a/engines/testbed/testsuite.cpp b/engines/testbed/testsuite.cpp index 8e5c1a2d80..c941a71a88 100644 --- a/engines/testbed/testsuite.cpp +++ b/engines/testbed/testsuite.cpp @@ -23,6 +23,7 @@ */ #include "common/config-manager.h" +#include "common/events.h" #include "common/stream.h" #include "graphics/fontman.h" @@ -42,7 +43,7 @@ bool Testsuite::isSessionInteractive = true; Common::String Testsuite::_logDirectory = ""; Common::String Testsuite::_logFilename = ""; Common::WriteStream *Testsuite::_ws = 0; -bool Testsuite::toQuit = false; +uint Testsuite::toQuit = kLoopNormal; void Testsuite::setLogDir(const char *dirname) { _logDirectory = dirname; @@ -207,18 +208,54 @@ void Testsuite::addTest(const Common::String &name, InvokingFunction f, bool isI Test* featureTest = new Test(name, f, isInteractive); _testsToExecute.push_back(featureTest); } - + +uint Testsuite::parseEvents() { + uint startTime = g_system->getMillis(); + uint end = startTime + kEventHandlingTime; + do { + Common::Event ev; + while (g_system->getEventManager()->pollEvent(ev)) { + switch (ev.type) { + case Common::EVENT_KEYDOWN: + if (ev.kbd.keycode == Common::KEYCODE_ESCAPE) { + return kSkipNext; + } + break; + case Common::EVENT_QUIT: + case Common::EVENT_RTL: + return kEngineQuit; + break; + default: + break; + } + } + g_system->delayMillis(10); + startTime = g_system->getMillis(); + } while (startTime <= end); + + return kLoopNormal; +} + void Testsuite::execute() { + // Main Loop for a testsuite + // Do nothing if meant to exit - if (toQuit) { + if (toQuit == kEngineQuit) { return; } for (Common::Array<Test*>::iterator i = _testsToExecute.begin(); i != _testsToExecute.end(); ++i) { + if (toQuit == kSkipNext) { + logPrintf("Info! Skipping Test: %s, Skipped by user.\n", ((*i)->featureName).c_str()); + toQuit = kLoopNormal; + continue; + } + if((*i)->isInteractive && !isSessionInteractive) { logPrintf("Info! Skipping Test: %s, non-interactive environment is selected\n", ((*i)->featureName).c_str()); continue; } + logPrintf("Info! Executing Test: %s\n", ((*i)->featureName).c_str()); _numTestsExecuted++; if ((*i)->driver()) { @@ -227,11 +264,17 @@ void Testsuite::execute() { } else { logPrintf("Result: Failed\n"); } - // Check if user wants to quit + // TODO: Display a screen here to user with details of upcoming test, he can skip it or Quit or RTL + // Check if user wants to quit/RTL/Skip next test by parsing events. + // Quit directly if explicitly requested + if (Engine::shouldQuit()) { - toQuit = true; + toQuit = kEngineQuit; + genReport(); return; } + + toQuit = parseEvents(); } genReport(); } diff --git a/engines/testbed/testsuite.h b/engines/testbed/testsuite.h index 84d99edc00..fe3559a5b9 100644 --- a/engines/testbed/testsuite.h +++ b/engines/testbed/testsuite.h @@ -43,6 +43,14 @@ enum OptionSelected { kOptionRight = 0 }; +enum { + kEngineQuit = 0, + kSkipNext = 1, + kLoopNormal = 2, + // Event handling time,(in ms) used in parseEvent() + kEventHandlingTime = 50 +}; + typedef bool (*InvokingFunction)(); /** @@ -111,6 +119,7 @@ public: * All code should go in here. */ virtual void execute(); + static uint parseEvents(); virtual const char *getName() const = 0; @@ -143,7 +152,7 @@ public: /** * Used from the code to decide if the engine needs to exit */ - static bool toQuit; + static uint toQuit; private: /** |