Test.h revision 80e39a77b16f4396eed230efea1d0b2fc8cbfb00
15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#ifndef skiatest_Test_DEFINED
2ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov#define skiatest_Test_DEFINED
3ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov
4ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov#include "SkRefCnt.h"
5ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov#include "SkString.h"
6ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov#include "SkTRegistry.h"
7ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov
8ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukovnamespace skiatest {
9ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov
10ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov    class Test;
11ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov
12ada92363bd7624a7bc76ba8da3b1ef264a2e830eAlexey Samsonov    class Reporter : public SkRefCnt {
13ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov    public:
14ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov        Reporter();
15ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov
16ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov        enum Result {
17ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov            kPassed,    // must begin with 0
18ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov            kFailed,
19ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov            /////
20ada92363bd7624a7bc76ba8da3b1ef264a2e830eAlexey Samsonov            kLastResult = kFailed
21ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov        };
22ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov
23ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov        void resetReporting();
24ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov        int countTests() const { return fTestCount; }
25ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov        int countResults(Result r) {
26ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov            SkASSERT((unsigned)r <= kLastResult);
27ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov            return fResultCount[r];
28ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov        }
29ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov
30ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov        void startTest(Test*);
31ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov        void report(const char testDesc[], Result);
32ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov        void endTest(Test*);
33ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov
34ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov        // helpers for tests
35ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov        void assertTrue(bool cond, const char desc[]) {
36ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov            if (!cond) {
37ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov                this->report(desc, kFailed);
38ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov            }
39ada92363bd7624a7bc76ba8da3b1ef264a2e830eAlexey Samsonov        }
40ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov        void assertFalse(bool cond, const char desc[]) {
415d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines            if (cond) {
42c44219cd5479a80ebb2b59779a41936d807f8840Alexey Samsonov                this->report(desc, kFailed);
43c44219cd5479a80ebb2b59779a41936d807f8840Alexey Samsonov            }
44ada92363bd7624a7bc76ba8da3b1ef264a2e830eAlexey Samsonov        }
45da3503782901d30bd6e48885055b51b38cf5126cDmitry Vyukov        void reportFailed(const char desc[]) {
46ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov            this->report(desc, kFailed);
47ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov        }
48        void reportFailed(const SkString& desc) {
49            this->report(desc.c_str(), kFailed);
50        }
51
52    protected:
53        virtual void onStart(Test*) {}
54        virtual void onReport(const char desc[], Result) {}
55        virtual void onEnd(Test*) {}
56
57    private:
58        Test* fCurrTest;
59        int fTestCount;
60        int fResultCount[kLastResult+1];
61
62        typedef SkRefCnt INHERITED;
63    };
64
65    class Test {
66    public:
67        Test();
68        virtual ~Test();
69
70        Reporter* getReporter() const { return fReporter; }
71        void setReporter(Reporter*);
72
73        const char* getName();
74        void run();
75
76    protected:
77        virtual void onGetName(SkString*) = 0;
78        virtual void onRun(Reporter*) = 0;
79
80    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
99