aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/wasabitest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/wasabitest.cpp')
-rw-r--r--Src/Wasabi/wasabitest.cpp285
1 files changed, 285 insertions, 0 deletions
diff --git a/Src/Wasabi/wasabitest.cpp b/Src/Wasabi/wasabitest.cpp
new file mode 100644
index 00000000..e88775cb
--- /dev/null
+++ b/Src/Wasabi/wasabitest.cpp
@@ -0,0 +1,285 @@
+#include <precomp.h>
+#include <api/api.h>
+#include <api/apiinit.h>
+#include <api/service/svcmgr.h>
+#include <api/timer/timerclient.h>
+#include <api/timer/timermul.h>
+#include <api/xml/xmlreader.h>
+#include <bfc/string/bigstring.h>
+#include <bfc/string/stringdict.h>
+
+// This is the Wasabi Library Test Application
+
+DECLARE_MODULE_SVCMGR
+
+#define TIMER_TEST_DURATION (MAX_TIMER_DELAY/1000)*4 // We should at least use (MAX_TIMER_DELAY/1000)*2 here so as to test the low speed timer cycle at least twice
+
+int failed = 0;
+
+#if defined(WASABI_COMPILE_TIMERS) || defined(WASABI_COMPILE_WND) || defined(WASABI_COMPILE_TEXTMODE)
+
+int exitpump = 0;
+
+//-------------------------------------------------------------------------------------------
+
+void doMessagePump() {
+ exitpump = 0;
+ // Despite appearances, this is portable
+ MSG msg;
+ while (!exitpump && GetMessage( &msg, NULL, 0, 0 ) ) {
+#ifdef WASABI_COMPILE_WND
+ TranslateMessage( &msg );
+#endif
+ DispatchMessage( &msg );
+ }
+}
+
+//-------------------------------------------------------------------------------------------
+
+void exitMessagePump() {
+ exitpump = 1;
+}
+
+#endif
+
+//-------------------------------------------------------------------------------------------
+void fail(const char *module, const char *test) {
+ failed++;
+ printf("\n\n*** FAILED *** : %s (%s)\n\n", module, test);
+ fflush(stdout);
+}
+
+//-------------------------------------------------------------------------------------------
+
+#ifdef WASABI_COMPILE_TIMERS
+
+// Multiplexed timers test
+
+int timer[10];
+
+class TestTimer : public TimerClientDI {
+public:
+ TestTimer() {
+ for (int id = 0; id < 10; id++) {
+ timer[id] = 0;
+ timerclient_setTimer(id+1, id*100+100);
+ }
+ }
+ virtual ~TestTimer() {
+ for (int id = 0; id < 10; id++) {
+ timerclient_killTimer(id+1);
+ }
+ }
+ virtual void timerclient_timerCallback(int id) {
+ if (id >= 1 && id <= 10) {
+ timer[id-1]+=timerclient_getSkipped()+1;
+ if (id == 1 || id == 10) {
+ printf("\r");
+ for (int i = 0; i < 10; i++) {
+ if (i > 0) printf(" | ");
+ printf("%d:%3d", i+1, timer[i]);
+ }
+ fflush(stdout);
+ }
+ if (id == 10 && timer[id-1] >= TIMER_TEST_DURATION)
+ exitMessagePump();
+ }
+ }
+};
+#endif
+
+//-------------------------------------------------------------------------------------------
+#ifdef WASABI_COMPILE_XMLPARSER
+// Xml parser test
+enum XML_TEST_TAGS {
+ XML_TEST_ROOT,
+ XML_TEST_TEST1,
+ XML_TEST_TEST2,
+};
+
+BEGIN_STRINGDICTIONARY(_XMLTESTTAGS);
+SDI("WasabiTest", XML_TEST_ROOT);
+SDI("Test1", XML_TEST_TEST1);
+SDI("Test2", XML_TEST_TEST2);
+END_STRINGDICTIONARY(_XMLTESTTAGS, xmltesttags);
+
+class XmlTest : public XmlReaderCallbackI {
+public:
+ XmlTest() : m_failed(0), m_inroot(0), m_intest1(0), m_intest2(0) {
+ BigString str;
+ str += "buf:";
+ str += "<WasabiTest>\n";
+ str += " <Test1>success</Test1>\n";
+ str += " <Test2 result=\"success\"/>\n";
+ str += "</WasabiTest>\n";
+ XmlReader::registerCallback("*", static_cast<api_xmlreadercallback*>(this));
+ XmlReader::loadFile(str, NULL, static_cast<api_xmlreadercallback*>(this));
+ XmlReader::unregisterCallback(static_cast<api_xmlreadercallback*>(this));
+ }
+ virtual ~XmlTest() {
+ }
+ virtual int xmlReaderDisplayErrors() { return 0; }
+ virtual void xmlReaderOnError(const char *filename, int linenum, const char *incpath, int errcode, const char *errstr) {
+ fail("XML TEST", "Parse error");
+ }
+ virtual void xmlReaderOnStartElementCallback(const char *xmlpath, const char *xmltag, api_xmlreaderparams *params) {
+ switch (xmltesttags.getId(xmltag)) {
+ case XML_TEST_ROOT:
+ m_inroot++;
+ printf(" <WasabiTest>\n");
+ fflush(stdout);
+ break;
+ case XML_TEST_TEST1:
+ m_intest1++;
+ printf(" <Test1>\n");
+ fflush(stdout);
+ break;
+ case XML_TEST_TEST2:
+ m_intest2++;
+ printf(" <Test2\n");
+ int _failed = 0;
+ for (int i=0;i<params->getNbItems();i++) {
+ printf(" %s = \"%s\"\n", params->getItemName(i), params->getItemValue(i));
+ if (i == 1) {
+ if (!STRCASEEQLSAFE(params->getItemValue(i), "success")) _failed = 1;
+ if (!STRCASEEQLSAFE(params->getItemName(i), "result")) _failed = 1;
+ }
+ }
+ if (_failed) {
+ m_failed = 1;
+ fail("XML PARSER", "Not receiving the right params in Test2");
+ }
+ fflush(stdout);
+ break;
+ }
+ }
+ virtual void xmlReaderOnEndElementCallback(const char *xmlpath, const char *xmltag) {
+ switch (xmltesttags.getId(xmltag)) {
+ case XML_TEST_ROOT:
+ m_inroot--;
+ printf(" </WasabiTest>\n");
+ fflush(stdout);
+ break;
+ case XML_TEST_TEST1:
+ m_intest1--;
+ printf(" </Test1>\n");
+ fflush(stdout);
+ break;
+ case XML_TEST_TEST2:
+ m_intest2--;
+ printf(" />\n");
+ fflush(stdout);
+ break;
+ }
+ }
+ virtual void xmlReaderOnCharacterDataCallback(const char *xmlpath, const char *xmltag, const char *str) {
+ if (m_intest1) {
+ printf(" Character Data reads \"%s\"\n", str);
+ if (!STRCASEEQL(str, "success")) {
+ m_failed = 1;
+ fail("XML PARSER", "Not receiving the right character data in Test1");
+ }
+ fflush(stdout);
+ }
+ }
+ int didFail() { return m_failed; }
+private:
+ int m_failed;
+ int m_inroot;
+ int m_intest1;
+ int m_intest2;
+};
+
+#endif
+//-------------------------------------------------------------------------------------------
+
+// 03F73CE0-987D-46fd-B2E3-DBB364A47F54
+static const GUID myappguid = { 0x3f73ce0, 0x987d, 0x46fd, { 0xb2, 0xe3, 0xdb, 0xb3, 0x64, 0xa4, 0x7f, 0x54 }};
+
+int main(int argc, char **argv) {
+ printf("-------------------------------------------------------------------------------\n");
+ printf("Initializing Wasabi API.\n");
+ printf("-------------------------------------------------------------------------------\n");
+ fflush(stdout);
+
+ ApiInit::init((HINSTANCE)0, myappguid, "", (HWND)NULL);
+
+ printf("\n- PASSED -\n\n");
+ fflush(stdout);
+
+ // Rudimentary svcmgr test: enumerate services
+ printf("-------------------------------------------------------------------------------\n");
+ printf("Testing service manager.\n");
+ printf("-------------------------------------------------------------------------------\n\n");
+ int n=ServiceManager::getNumServicesByGuid();
+ printf("Services running : %d\n\n", n);
+ fflush(stdout);
+ int i;
+ for (i=0;i<n;i++) {
+ waServiceFactory *factory = ServiceManager::enumService(i);
+ char sguid[256];
+ nsGUID::toChar(factory->getGuid(), sguid);
+ printf(" %d : %s (%s)\n", i, factory->getServiceName(), sguid);
+ }
+ if (i > 0) {
+ printf("\n- PASSED -\n\n");
+ } else {
+ fail("SVCMGR", "service enumerator returns no service present");
+ }
+ fflush(stdout);
+
+#ifdef WASABI_COMPILE_TIMERS
+ {
+ DWORD ds = Std::getTickCount();
+ // Multiplexed timers test
+ printf("-------------------------------------------------------------------------------\n");
+ printf("Testing timers for %d seconds.\n", TIMER_TEST_DURATION);
+ printf("-------------------------------------------------------------------------------\n\n");
+ fflush(stdout);
+ TestTimer tt;
+ doMessagePump();
+ printf("\n");
+ DWORD dt = Std::getTickCount() - ds;
+ // let's assume this is a VERY VERY busy cpu, we're just trying to determine if the timers have been running...
+ if (dt < (TIMER_TEST_DURATION-1)*1000 || dt > (TIMER_TEST_DURATION+1)*1000) {
+ fail("TIMERS", "Test was out of range by more than 1s");
+ } else {
+ printf("\n- PASSED -\n\n");
+ }
+ fflush(stdout);
+ }
+#endif
+
+#ifdef WASABI_COMPILE_XMLPARSER
+ {
+ // Multiplexed timers test
+ printf("-------------------------------------------------------------------------------\n");
+ printf("Testing XML parser.\n");
+ printf("-------------------------------------------------------------------------------\n\n");
+ fflush(stdout);
+ XmlTest xt;
+ if (!xt.didFail()) {
+ printf("\n- PASSED -\n\n");
+ fflush(stdout);
+ } // else msg is already printed
+ }
+#endif
+
+ printf("-------------------------------------------------------------------------------\n");
+ printf("Shutting down.\n");
+ printf("-------------------------------------------------------------------------------\n");
+
+ ApiInit::shutdown();
+
+ printf("\n- PASSED -\n\n");
+ printf("===============================================================================\n");
+ printf("Result : ");
+ if (failed)
+ printf("*** %d FAILURE%s ***\n", failed, failed > 1 ? "S" : "");
+ else
+ printf("- ALL PASSED -\n");
+ printf("===============================================================================\n\n");
+
+ return 0;
+}
+