add initial unittest framework (tests)
move some previous unittests out of core classes and into tests



git-svn-id: http://skia.googlecode.com/svn/trunk@96 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/Test.h b/tests/Test.h
new file mode 100644
index 0000000..8d2eb87
--- /dev/null
+++ b/tests/Test.h
@@ -0,0 +1,98 @@
+#ifndef skiatest_Test_DEFINED
+#define skiatest_Test_DEFINED
+
+#include "SkRefCnt.h"
+#include "SkString.h"
+#include "SkTRegistry.h"
+
+namespace skiatest {
+    
+    class Test;
+
+    class Reporter : public SkRefCnt {
+    public:
+        Reporter();
+
+        enum Result {
+            kPassed,    // must begin with 0
+            kFailed,
+            /////
+            kLastResult = kFailed
+        };
+        
+        void resetReporting();
+        int countTests() const { return fTestCount; }
+        int countResults(Result r) {
+            SkASSERT((unsigned)r <= kLastResult);
+            return fResultCount[r];
+        }
+
+        void startTest(Test*);
+        void report(const char testDesc[], Result);
+        void endTest(Test*);
+        
+        // helpers for tests
+        void assertTrue(bool cond, const char desc[]) {
+            if (!cond) {
+                this->report(desc, kFailed);
+            }
+        }
+        void assertFalse(bool cond, const char desc[]) {
+            if (cond) {
+                this->report(desc, kFailed);
+            }
+        }
+        void reportFailed(const char desc[]) {
+            this->report(desc, kFailed);
+        }
+        void reportFailed(const SkString& desc) {
+            this->report(desc.c_str(), kFailed);
+        }
+        
+    protected:
+        virtual void onStart(Test*) {}
+        virtual void onReport(const char desc[], Result) {}
+        virtual void onEnd(Test*) {}
+        
+    private:
+        Test* fCurrTest;
+        int fTestCount;
+        int fResultCount[kLastResult+1];
+        
+        typedef SkRefCnt INHERITED;
+    };
+    
+    class Test {
+    public:        
+        Test();
+        virtual ~Test();
+
+        Reporter* getReporter() const { return fReporter; }
+        void setReporter(Reporter*);
+        
+        const char* getName();
+        void run();
+        
+    protected:
+        virtual void onGetName(SkString*) = 0;
+        virtual void onRun(Reporter*) = 0;
+        
+    private:
+        Reporter*   fReporter;
+        SkString    fName;
+    };
+
+    typedef SkTRegistry<Test*, void*> TestRegistry;
+}
+
+#define REPORTER_ASSERT(r, cond)                                        \
+    do {                                                                \
+        if (!(cond)) {                                                  \
+            SkString desc;                                              \
+            desc.printf("%s:%d: %s", __FILE__, __LINE__, #cond);      \
+            r->reportFailed(desc);                                      \
+        }                                                               \
+    } while(0)
+
+
+#endif