1#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 {
9
10    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        };
22
23        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*);
33
34        // 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        }
51
52        bool getCurrSuccess() const {
53            return fCurrTestSuccess;
54        }
55
56    protected:
57        virtual void onStart(Test*) {}
58        virtual void onReport(const char desc[], Result) {}
59        virtual void onEnd(Test*) {}
60
61    private:
62        Test* fCurrTest;
63        int fTestCount;
64        int fResultCount[kLastResult+1];
65        bool fCurrTestSuccess;
66
67        typedef SkRefCnt INHERITED;
68    };
69
70    class Test {
71    public:
72        Test();
73        virtual ~Test();
74
75        Reporter* getReporter() const { return fReporter; }
76        void setReporter(Reporter*);
77
78        const char* getName();
79        bool run(); // returns true on success
80
81    protected:
82        virtual void onGetName(SkString*) = 0;
83        virtual void onRun(Reporter*) = 0;
84
85    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
104