blob: d5dc9e39eaedffc05a9ad0cd0c5d224c27b37715 [file] [log] [blame]
reed@android.comed673312009-02-27 16:24:51 +00001#ifndef skiatest_Test_DEFINED
2#define skiatest_Test_DEFINED
3
4#include "SkRefCnt.h"
5#include "SkString.h"
6#include "SkTRegistry.h"
7
8namespace skiatest {
reed@android.com80e39a72009-04-02 16:59:40 +00009
reed@android.comed673312009-02-27 16:24:51 +000010 class Test;
11
12 class Reporter : public SkRefCnt {
13 public:
14 Reporter();
15
16 enum Result {
17 kPassed, // must begin with 0
18 kFailed,
19 /////
20 kLastResult = kFailed
21 };
reed@android.com80e39a72009-04-02 16:59:40 +000022
reed@android.comed673312009-02-27 16:24:51 +000023 void resetReporting();
24 int countTests() const { return fTestCount; }
25 int countResults(Result r) {
26 SkASSERT((unsigned)r <= kLastResult);
27 return fResultCount[r];
28 }
29
30 void startTest(Test*);
31 void report(const char testDesc[], Result);
32 void endTest(Test*);
reed@android.com80e39a72009-04-02 16:59:40 +000033
reed@android.comed673312009-02-27 16:24:51 +000034 // helpers for tests
35 void assertTrue(bool cond, const char desc[]) {
36 if (!cond) {
37 this->report(desc, kFailed);
38 }
39 }
40 void assertFalse(bool cond, const char desc[]) {
41 if (cond) {
42 this->report(desc, kFailed);
43 }
44 }
45 void reportFailed(const char desc[]) {
46 this->report(desc, kFailed);
47 }
48 void reportFailed(const SkString& desc) {
49 this->report(desc.c_str(), kFailed);
50 }
reed@android.com80e39a72009-04-02 16:59:40 +000051
reed@android.comed673312009-02-27 16:24:51 +000052 protected:
53 virtual void onStart(Test*) {}
54 virtual void onReport(const char desc[], Result) {}
55 virtual void onEnd(Test*) {}
reed@android.com80e39a72009-04-02 16:59:40 +000056
reed@android.comed673312009-02-27 16:24:51 +000057 private:
58 Test* fCurrTest;
59 int fTestCount;
60 int fResultCount[kLastResult+1];
reed@android.com80e39a72009-04-02 16:59:40 +000061
reed@android.comed673312009-02-27 16:24:51 +000062 typedef SkRefCnt INHERITED;
63 };
reed@android.com80e39a72009-04-02 16:59:40 +000064
reed@android.comed673312009-02-27 16:24:51 +000065 class Test {
reed@android.com80e39a72009-04-02 16:59:40 +000066 public:
reed@android.comed673312009-02-27 16:24:51 +000067 Test();
68 virtual ~Test();
69
70 Reporter* getReporter() const { return fReporter; }
71 void setReporter(Reporter*);
reed@android.com80e39a72009-04-02 16:59:40 +000072
reed@android.comed673312009-02-27 16:24:51 +000073 const char* getName();
74 void run();
reed@android.com80e39a72009-04-02 16:59:40 +000075
reed@android.comed673312009-02-27 16:24:51 +000076 protected:
77 virtual void onGetName(SkString*) = 0;
78 virtual void onRun(Reporter*) = 0;
reed@android.com80e39a72009-04-02 16:59:40 +000079
reed@android.comed673312009-02-27 16:24:51 +000080 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