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