blob: de518014b7742368cdb4e23357f852158d6719bc [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.comeeb3b7f2009-04-09 04:06:54 +000051
52 bool getCurrSuccess() const {
53 return fCurrTestSuccess;
54 }
55
reed@android.comed673312009-02-27 16:24:51 +000056 protected:
57 virtual void onStart(Test*) {}
58 virtual void onReport(const char desc[], Result) {}
59 virtual void onEnd(Test*) {}
reed@android.com80e39a72009-04-02 16:59:40 +000060
reed@android.comed673312009-02-27 16:24:51 +000061 private:
62 Test* fCurrTest;
63 int fTestCount;
64 int fResultCount[kLastResult+1];
reed@android.comeeb3b7f2009-04-09 04:06:54 +000065 bool fCurrTestSuccess;
reed@android.com80e39a72009-04-02 16:59:40 +000066
reed@android.comed673312009-02-27 16:24:51 +000067 typedef SkRefCnt INHERITED;
68 };
reed@android.com80e39a72009-04-02 16:59:40 +000069
reed@android.comed673312009-02-27 16:24:51 +000070 class Test {
reed@android.com80e39a72009-04-02 16:59:40 +000071 public:
reed@android.comed673312009-02-27 16:24:51 +000072 Test();
73 virtual ~Test();
74
75 Reporter* getReporter() const { return fReporter; }
76 void setReporter(Reporter*);
reed@android.com80e39a72009-04-02 16:59:40 +000077
reed@android.comed673312009-02-27 16:24:51 +000078 const char* getName();
reed@android.comeeb3b7f2009-04-09 04:06:54 +000079 bool run(); // returns true on success
reed@android.com80e39a72009-04-02 16:59:40 +000080
reed@android.comed673312009-02-27 16:24:51 +000081 protected:
82 virtual void onGetName(SkString*) = 0;
83 virtual void onRun(Reporter*) = 0;
reed@android.com80e39a72009-04-02 16:59:40 +000084
reed@android.comed673312009-02-27 16:24:51 +000085 private:
86 Reporter* fReporter;
87 SkString fName;
88 };
89
90 typedef SkTRegistry<Test*, void*> TestRegistry;
91}
92
93#define REPORTER_ASSERT(r, cond) \
94 do { \
95 if (!(cond)) { \
96 SkString desc; \
97 desc.printf("%s:%d: %s", __FILE__, __LINE__, #cond); \
98 r->reportFailed(desc); \
99 } \
100 } while(0)
101
102
103#endif