Add small testing framework.
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/makefile
Added: branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
Added: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h
Added: branches/xmlbuildsystem/reactos/tools/rbuild/test.h
Added: branches/xmlbuildsystem/reactos/tools/rbuild/tests/
Added: branches/xmlbuildsystem/reactos/tools/rbuild/tests/alltests.cpp
Added: branches/xmlbuildsystem/reactos/tools/rbuild/tests/moduletest.cpp
  _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/makefile
--- branches/xmlbuildsystem/reactos/tools/rbuild/makefile
2005-01-03 23:02:15 UTC (rev 12766)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/makefile
2005-01-03 23:04:52 UTC (rev 12767)
@@ -4,10 +4,14 @@
 all: $(TARGET)
-OBJECTS = rbuild.o
+BASE_OBJECTS = module.o
-CLEAN_FILES = *.o rbuild$(EXE_POSTFIX)
+OBJECTS = $(BASE_OBJECTS) rbuild.o
+TESTS = tests/moduletest.o
+
+TEST_OBJECTS = $(BASE_OBJECTS) $(TESTS) tests/alltests.o
+
 HOST_CFLAGS = -g -I. -Werror -Wall
 HOST_LFLAGS = -g
@@ -19,11 +23,15 @@
 clean:
        -rm -f *.o
        -rm -f rbuild$(EXE_POSTFIX)
+       -rm -f tests/*.o
+       -rm -f rbuild_tests$(EXE_POSTFIX)
 endif
 ifeq ($(HOST),mingw32-windows)
 clean:
        -del *.o
        -del rbuild$(EXE_POSTFIX)
+       -del tests\*.o
+       -del rbuild_tests$(EXE_POSTFIX)
 endif
 .phony: clean
@@ -32,4 +40,10 @@
        $(HALFVERBOSEECHO) [CXX]     $<
        $(HOST_CXX) $(HOST_CFLAGS) -c $< -o $@
+test: rbuild_tests$(EXE_POSTFIX)
+       $(EXE_PREFIX)rbuild_tests$(EXE_POSTFIX)
+
+rbuild_tests$(EXE_POSTFIX): $(TEST_OBJECTS)
+       $(HOST_CXX) $(TEST_OBJECTS) $(HOST_LFLAGS) -o
rbuild_tests$(EXE_POSTFIX)
+
 include $(PATH_TO_TOP)/rules.mak
  _____
Added: branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp
2005-01-03 23:02:15 UTC (rev 12766)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp
2005-01-03 23:04:52 UTC (rev 12767)
@@ -0,0 +1,5 @@
+#include "rbuild.h"
+
+Module::Module(XMLElement moduleNode)
+{
+}
  _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
2005-01-03 23:02:15 UTC (rev 12766)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
2005-01-03 23:04:52 UTC (rev 12767)
@@ -4,18 +4,11 @@
 #pragma warning ( disable : 4786 )
 #endif//_MSC_VER
-#include <string>
-#include <vector>
-
 #include <stdio.h>
 #include <io.h>
 #include <assert.h>
-//#include <sys/stat.h>
-//#include <sys/types.h>
+#include "rbuild.h"
-using std::string;
-using std::vector;
-
 #ifdef _MSC_VER
 unsigned __int64
 #else
@@ -36,218 +29,216 @@
 static const char* WS = " \t\r\n";
 static const char* WSEQ = " =\t\r\n";
-class XMLFile
+XMLFile::XMLFile()
 {
-       vector<FILE*> _f;
-       string _buf;
-       const char *_p, *_end;
-public:
-       XMLFile() {}
-       void close()
+}
+
+void XMLFile::close()
+{
+       while ( _f.size() )
        {
-               while ( _f.size() )
-               {
-                       fclose ( _f.back() );
-                       _f.pop_back();
-               }
-               _buf.resize(0);
-               _p = _end = NULL;
+               fclose ( _f.back() );
+               _f.pop_back();
        }
-       bool open ( const char* filename )
+       _buf.resize(0);
+       _p = _end = NULL;
+}
+
+bool XMLFile::open(const char* filename)
+{
+       close();
+       FILE* f = fopen ( filename, "r" );
+       if ( !f )
+               return false;
+       unsigned long len = (unsigned long)filelen(f);
+       _buf.resize ( len );
+       fread ( &_buf[0], 1, len, f );
+       _p = _buf.c_str();
+       _end = _p + len;
+       _f.push_back ( f );
+       next_token();
+       return true;
+}
+
+// next_token() moves the pointer to next token, which may be
+// an xml element or a text element, basically it's a glorified
+// skipspace, normally the user of this class won't need to call
+// this function
+void XMLFile::next_token()
+{
+       _p += strspn ( _p, WS );
+}
+
+bool XMLFile::next_is_text()
+{
+       return *_p != '<';
+}
+
+bool XMLFile::more_tokens()
+{
+       return _p != _end;
+}
+
+// get_token() is used to return a token, and move the pointer
+// past the token
+bool XMLFile::get_token(string& token)
+{
+       const char* tokend;
+       if ( *_p == '<' )
        {
-               close();
-               FILE* f = fopen ( filename, "r" );
-               if ( !f )
-                       return false;
-               unsigned long len = (unsigned long)filelen(f);
-               _buf.resize ( len );
-               fread ( &_buf[0], 1, len, f );
-               _p = _buf.c_str();
-               _end = _p + len;
-               _f.push_back ( f );
-               next_token();
-               return true;
+               tokend = strchr ( _p, '>' );
+               if ( !tokend )
+                       tokend = _end;
+               else
+                       ++tokend;
        }
-       // next_token() moves the pointer to next token, which may be
-       // an xml element or a text element, basically it's a glorified
-       // skipspace, normally the user of this class won't need to call
-       // this function
-       void next_token()
+       else
        {
-               _p += strspn ( _p, WS );
+               tokend = strchr ( _p, '<' );
+               if ( !tokend )
+                       tokend = _end;
+               while ( tokend > _p && isspace(tokend[-1]) )
+                       --tokend;
        }
-       bool next_is_text()
-       {
-               return *_p != '<';
-       }
-       bool more_tokens()
-       {
-               return _p != _end;
-       }
-       // get_token() is used to return a token, and move the pointer
-       // past the token
-       bool get_token ( string& token )
-       {
-               const char* tokend;
-               if ( *_p == '<' )
-               {
-                       tokend = strchr ( _p, '>' );
-                       if ( !tokend )
-                               tokend = _end;
-                       else
-                               ++tokend;
-               }
-               else
-               {
-                       tokend = strchr ( _p, '<' );
-                       if ( !tokend )
-                               tokend = _end;
-                       while ( tokend > _p && isspace(tokend[-1]) )
-                               --tokend;
-               }
-               if ( tokend == _p )
-                       return false;
-               token = string ( _p, tokend-_p );
-               _p = tokend;
-               next_token();
-               return true;
-       }
+       if ( tokend == _p )
+               return false;
+       token = string ( _p, tokend-_p );
+       _p = tokend;
+       next_token();
+       return true;
+}
+
 #if 0
-       bool getc ( char& c )
+bool XMLFile::getc(char& c)
+{
+       while ( _bufidx >= _buf.size() )
        {
-               while ( _bufidx >= _buf.size() )
+               static buf[4096];
+               if ( !fgets ( buf, sizeof(buf), _f.back() ) )
                {
-                       static buf[4096];
-                       if ( !fgets ( buf, sizeof(buf), _f.back() ) )
-                       {
-                               fclose ( _f.back() );
-                               f.pop_back();
-                               continue;
-                       }
-                       _buf = buf;
-                       _bufidx = 0;
-                       // REM TODO FIXME - check for and load includes
here...
-                       /*char* p = &_buf[0];
-                       p += strspn ( p, " \t" );
-                       if ( *p++ != '#' )
-                               break;
-                       p += strspn ( p, " \t" );
-                       if ( strncmp ( p, "include", 7 ) )
-                               break;
-                       p += 7;
-                       if ( !isspace(*p++) )
-                               break;*/
-
+                       fclose ( _f.back() );
+                       f.pop_back();
+                       continue;
                }
-               c = _buf[_bufidx++];
-               return true;
+               _buf = buf;
+               _bufidx = 0;
+               // REM TODO FIXME - check for and load includes here...
+               /*char* p = &_buf[0];
+               p += strspn ( p, " \t" );
+               if ( *p++ != '#' )
+                       break;
+               p += strspn ( p, " \t" );
+               if ( strncmp ( p, "include", 7 ) )
+                       break;
+               p += 7;
+               if ( !isspace(*p++) )
+                       break;*/
+
        }
+       c = _buf[_bufidx++];
+       return true;
+}
 #endif
-};
-class XMLAttribute
+
+XMLAttribute::XMLAttribute()
 {
-public:
-       string name, value;
+}
-       XMLAttribute() {}
+XMLAttribute::XMLAttribute(const string& name_,
+                           const string& value_)
+: name(name_), value(value_)
+{
+}
-       XMLAttribute ( const string& name_, const string& value_ )
-               : name(name_), value(value_)
-       {
-       }
+XMLAttribute::XMLAttribute(const XMLAttribute& src)
+{
+       name = src.name;
+       value = src.value;
+}
-       XMLAttribute ( const XMLAttribute& src )
-       {
-               name = src.name;
-               value = src.value;
-       }
+XMLAttribute& XMLAttribute::operator=(const XMLAttribute& src)
+{
+       name = src.name;
+       value = src.value;
+       return *this;
+}
-       XMLAttribute& operator = ( const XMLAttribute& src )
-       {
-               name = src.name;
-               value = src.value;
-               return *this;
-       }
-};
-class XMLElement
+XMLElement::XMLElement()
 {
-public:
-       string name;
-       vector<XMLAttribute> attributes;
-       vector<XMLElement*> subElements;
-       string value;
+}
-       XMLElement() {}
-       // Parse() returns true if you need to look for a </tag> for
-       // this one...
-       bool Parse ( const string& token, bool& end_tag )
+// Parse() returns true if you need to look for a </tag> for
+// this one...
+bool XMLElement::Parse(const string& token,
+                       bool& end_tag)
+{
+       const char* p = token.c_str();
+       assert ( *p == '<' );
+       p++;
+       p += strspn ( p, WS );
+       end_tag = ( *p == '/' );
+       if ( end_tag )
        {
-               const char* p = token.c_str();
-               assert ( *p == '<' );
-               p++;
+               ++p;
                p += strspn ( p, WS );
-               end_tag = ( *p == '/' );
-               if ( end_tag )
-               {
-                       ++p;
-                       p += strspn ( p, WS );
-               }
-               const char* end = strpbrk ( p, WS );
+       }
+       const char* end = strpbrk ( p, WS );
+       if ( !end )
+       {
+               end = strpbrk ( p, "/>" );
+               assert ( end );
+       }
+       name = string ( p, end-p );
+       p = end;
+       p += strspn ( p, WS );
+       while ( *p != '>' && *p != '/' )
+       {
+               end = strpbrk ( p, WSEQ );
                if ( !end )
                {
                        end = strpbrk ( p, "/>" );
                        assert ( end );
                }
-               name = string ( p, end-p );
+               string attribute ( p, end-p ), value;
                p = end;
                p += strspn ( p, WS );
-               while ( *p != '>' && *p != '/' )
+               if ( *p == '=' )
                {
-                       end = strpbrk ( p, WSEQ );
+                       ++p;
+                       p += strspn ( p, WS );
+                       char quote = 0;
+                       if ( strchr ( "\"'", *p ) )
+                       {
+                               quote = *p++;
+                               end = strchr ( p, quote );
+                       }
+                       else
+                       {
+                               end = strpbrk ( p, WS );
+                       }
                        if ( !end )
                        {
-                               end = strpbrk ( p, "/>" );
-                               assert ( end );
+                               end = strchr ( p, '>' );
+                               assert(end);
+                               if ( end[-1] == '/' )
+                                       end--;
                        }
-                       string attribute ( p, end-p ), value;
+                       value = string ( p, end-p );
                        p = end;
+                       if ( quote && *p == quote )
+                               p++;
                        p += strspn ( p, WS );
-                       if ( *p == '=' )
-                       {
-                               ++p;
-                               p += strspn ( p, WS );
-                               char quote = 0;
-                               if ( strchr ( "\"'", *p ) )
-                               {
-                                       quote = *p++;
-                                       end = strchr ( p, quote );
-                               }
-                               else
-                               {
-                                       end = strpbrk ( p, WS );
-                               }
-                               if ( !end )
-                               {
-                                       end = strchr ( p, '>' );
-                                       assert(end);
-                                       if ( end[-1] == '/' )
-                                               end--;
-                               }
-                               value = string ( p, end-p );
-                               p = end;
-                               if ( quote && *p == quote )
-                                       p++;
-                               p += strspn ( p, WS );
-                       }
-                       attributes.push_back ( XMLAttribute ( attribute,
value ) );
                }
-               return !( *p == '/' ) && !end_tag;
+               attributes.push_back ( XMLAttribute ( attribute, value )
);
        }
-};
+       return !( *p == '/' ) && !end_tag;
+}
-XMLElement* XMLParse ( XMLFile& f, bool* pend_tag = NULL )
+
+XMLElement* XMLParse(XMLFile& f,
+                     bool* pend_tag = NULL)
 {
        string token;
        if ( !f.get_token(token) )
@@ -310,11 +301,11 @@
                return -1;
        }
-       XMLElement* head = XMLParse ( f );
-  if (head)
-  {
-         // REM TODO FIXME actually do something with the parsed info
-  }
+       XMLElement* head = XMLParse(f);
+       if (head)
+       {
+               // REM TODO FIXME actually do something with the parsed
info
+       }
        return 0;
 }
  _____
Added: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h
--- branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h
2005-01-03 23:02:15 UTC (rev 12766)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h
2005-01-03 23:04:52 UTC (rev 12767)
@@ -0,0 +1,64 @@
+#ifndef __RBUILD_H
+#define __RBUILD_H
+
+#include <string>
+#include <vector>
+
+using std::string;
+using std::vector;
+
+class XMLFile
+{
+       friend class XMLElement;
+public:
+       XMLFile();
+       void close();
+       bool open(const char* filename);
+       void next_token();
+       bool next_is_text();
+       bool more_tokens();
+       bool get_token(string& token);
+
+private:
+       vector<FILE*> _f;
+       string _buf;
+
+       const char *_p, *_end;
+};
+
+
+class XMLAttribute
+{
+public:
+       string name;
+       string value;
+
+       XMLAttribute();
+       XMLAttribute ( const string& name_, const string& value_ );
+//             : name(name_), value(value_);
+       XMLAttribute ( const XMLAttribute& src );
+       XMLAttribute& operator = ( const XMLAttribute& src );
+};
+
+
+class XMLElement
+{
+public:
+       string name;
+       vector<XMLAttribute> attributes;
+       vector<XMLElement*> subElements;
+       string value;
+
+       XMLElement();
+       bool Parse(const string& token,
+                  bool& end_tag);
+};
+
+
+class Module
+{
+public:
+       Module(XMLElement moduleNode);
+};
+
+#endif /* __RBUILD_H */
  _____
Added: branches/xmlbuildsystem/reactos/tools/rbuild/test.h
--- branches/xmlbuildsystem/reactos/tools/rbuild/test.h 2005-01-03
23:02:15 UTC (rev 12766)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/test.h 2005-01-03
23:04:52 UTC (rev 12767)
@@ -0,0 +1,30 @@
+#ifndef __TEST_H
+#define __TEST_H
+
+#include "rbuild.h"
+
+class BaseTest
+{
+public:
+       bool Failed;
+       BaseTest();
+       /*virtual void Run();*/
+protected:
+       void Assert(char *message);
+       void IsTrue(bool condition);
+       void IsFalse(bool condition);
+       void AreEqual(int expected,
+                     int actual);
+       void AreNotEqual(int expected,
+                        int actual);
+private:
+       void Fail();
+};
+
+
+class ModuleTest : public BaseTest
+{
+       void Run();
+};
+
+#endif /* __TEST_H */
  _____
Added: branches/xmlbuildsystem/reactos/tools/rbuild/tests/alltests.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/tests/alltests.cpp
2005-01-03 23:02:15 UTC (rev 12766)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/tests/alltests.cpp
2005-01-03 23:04:52 UTC (rev 12767)
@@ -0,0 +1,123 @@
+#include "rbuild.h"
+#include "test.h"
+
+BaseTest::BaseTest()
+{
+       Failed = true;
+}
+/*
+void BaseTest::Run()
+{
+}
+*/
+void BaseTest::Assert(char *message)
+{
+       printf(message);
+       Fail();
+}
+
+void BaseTest::IsTrue(bool condition)
+{
+       if (!condition)
+       {
+               char message[100];
+               sprintf(message,
+                       "Condition was not true at %s:%d",
+                       __FILE__,
+                       __LINE__);
+               Assert(message);
+       }
+}
+
+void BaseTest::IsFalse(bool condition)
+{
+       if (condition)
+       {
+               char message[100];
+               sprintf(message,
+                       "Condition was not false at %s:%d",
+                       __FILE__,
+                       __LINE__);
+               Assert(message);
+       }
+}
+
+void BaseTest::AreEqual(int expected,
+                        int actual)
+{
+       if (actual != expected)
+       {
+               char message[100];
+               sprintf(message,
+                       "Expected %d/0x%.08x was %d/0x%.08x at %s:%d",
+                       expected,
+                       expected,
+                       actual,
+                       actual,
+                       __FILE__,
+                       __LINE__);
+               Assert(message);
+       }
+}
+
+void BaseTest::AreNotEqual(int expected,
+                           int actual)
+{
+       if (actual == expected)
+       {
+               char message[100];
+               sprintf(message,
+                       "Actual value expected to be different from
%d/0x%.08x at %s:%d",
+                       expected,
+                       expected,
+                       __FILE__,
+                       __LINE__);
+               Assert(message);
+       }
+}
+
+void BaseTest::Fail()
+{
+       Failed = true;
+}
+
+
+class TestDispatcher
+{
+public:
+       void Run()
+       {
+               int numberOfFailedTests = 0;
+               vector<BaseTest> tests = GetTests();
+               for (size_t i = 0; i < tests.size(); i++)
+               {
+                       BaseTest& test = tests[i];
+                       /*test.Run();*/
+                       if (test.Failed)
+                               numberOfFailedTests++;
+               }
+
+               if (numberOfFailedTests > 0)
+                       printf("%d tests failed",
+                              numberOfFailedTests);
+               else
+                       printf("All tests succeeded");
+       }
+
+private:
+       vector<BaseTest> GetTests()
+       {
+               vector<BaseTest> tests;
+               tests.push_back(ModuleTest());
+               return tests;
+       }
+};
+
+
+int main(int argc,
+         char** argv)
+{
+       TestDispatcher testDispatcher = TestDispatcher();
+       testDispatcher.Run();
+       return 0;
+};
  _____
Added: branches/xmlbuildsystem/reactos/tools/rbuild/tests/moduletest.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/tests/moduletest.cpp
2005-01-03 23:02:15 UTC (rev 12766)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/tests/moduletest.cpp
2005-01-03 23:04:52 UTC (rev 12767)
@@ -0,0 +1,6 @@
+#include "test.h"
+
+void ModuleTest::Run()
+{
+       IsTrue(false);
+}