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