Test.h revision 80e39a77b16f4396eed230efea1d0b2fc8cbfb00
15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#ifndef skiatest_Test_DEFINED 2ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov#define skiatest_Test_DEFINED 3ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov 4ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov#include "SkRefCnt.h" 5ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov#include "SkString.h" 6ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov#include "SkTRegistry.h" 7ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov 8ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukovnamespace skiatest { 9ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov 10ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov class Test; 11ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov 12ada92363bd7624a7bc76ba8da3b1ef264a2e830eAlexey Samsonov class Reporter : public SkRefCnt { 13ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov public: 14ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov Reporter(); 15ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov 16ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov enum Result { 17ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov kPassed, // must begin with 0 18ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov kFailed, 19ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov ///// 20ada92363bd7624a7bc76ba8da3b1ef264a2e830eAlexey Samsonov kLastResult = kFailed 21ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov }; 22ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov 23ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov void resetReporting(); 24ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov int countTests() const { return fTestCount; } 25ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov int countResults(Result r) { 26ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov SkASSERT((unsigned)r <= kLastResult); 27ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov return fResultCount[r]; 28ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov } 29ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov 30ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov void startTest(Test*); 31ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov void report(const char testDesc[], Result); 32ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov void endTest(Test*); 33ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov 34ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov // helpers for tests 35ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov void assertTrue(bool cond, const char desc[]) { 36ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov if (!cond) { 37ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov this->report(desc, kFailed); 38ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov } 39ada92363bd7624a7bc76ba8da3b1ef264a2e830eAlexey Samsonov } 40ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov void assertFalse(bool cond, const char desc[]) { 415d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines if (cond) { 42c44219cd5479a80ebb2b59779a41936d807f8840Alexey Samsonov this->report(desc, kFailed); 43c44219cd5479a80ebb2b59779a41936d807f8840Alexey Samsonov } 44ada92363bd7624a7bc76ba8da3b1ef264a2e830eAlexey Samsonov } 45da3503782901d30bd6e48885055b51b38cf5126cDmitry Vyukov void reportFailed(const char desc[]) { 46ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov this->report(desc, kFailed); 47ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov } 48 void reportFailed(const SkString& desc) { 49 this->report(desc.c_str(), kFailed); 50 } 51 52 protected: 53 virtual void onStart(Test*) {} 54 virtual void onReport(const char desc[], Result) {} 55 virtual void onEnd(Test*) {} 56 57 private: 58 Test* fCurrTest; 59 int fTestCount; 60 int fResultCount[kLastResult+1]; 61 62 typedef SkRefCnt INHERITED; 63 }; 64 65 class Test { 66 public: 67 Test(); 68 virtual ~Test(); 69 70 Reporter* getReporter() const { return fReporter; } 71 void setReporter(Reporter*); 72 73 const char* getName(); 74 void run(); 75 76 protected: 77 virtual void onGetName(SkString*) = 0; 78 virtual void onRun(Reporter*) = 0; 79 80 private: 81 Reporter* fReporter; 82 SkString fName; 83 }; 84 85 typedef SkTRegistry<Test*, void*> TestRegistry; 86} 87 88#define REPORTER_ASSERT(r, cond) \ 89 do { \ 90 if (!(cond)) { \ 91 SkString desc; \ 92 desc.printf("%s:%d: %s", __FILE__, __LINE__, #cond); \ 93 r->reportFailed(desc); \ 94 } \ 95 } while(0) 96 97 98#endif 99