Test.h revision cb62650ecfd323a1ac215103a4d3106faad3c3cd
1
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#ifndef skiatest_Test_DEFINED
9#define skiatest_Test_DEFINED
10
11#include "SkRefCnt.h"
12#include "SkString.h"
13#include "SkTRegistry.h"
14
15class GrContextFactory;
16
17namespace skiatest {
18
19    class Test;
20
21    class Reporter : public SkRefCnt {
22    public:
23        SK_DECLARE_INST_COUNT(Reporter)
24        Reporter();
25
26        enum Result {
27            kPassed,    // must begin with 0
28            kFailed,
29            /////
30            kLastResult = kFailed
31        };
32
33        void resetReporting();
34        int countTests() const { return fTestCount; }
35        int countResults(Result r) {
36            SkASSERT((unsigned)r <= kLastResult);
37            return fResultCount[r];
38        }
39
40        void startTest(Test*);
41        void report(const char testDesc[], Result);
42        void endTest(Test*);
43
44        // helpers for tests
45        void assertTrue(bool cond, const char desc[]) {
46            if (!cond) {
47                this->report(desc, kFailed);
48            }
49        }
50        void assertFalse(bool cond, const char desc[]) {
51            if (cond) {
52                this->report(desc, kFailed);
53            }
54        }
55        void reportFailed(const char desc[]) {
56            this->report(desc, kFailed);
57        }
58        void reportFailed(const SkString& desc) {
59            this->report(desc.c_str(), kFailed);
60        }
61
62        bool getCurrSuccess() const {
63            return fCurrTestSuccess;
64        }
65
66    protected:
67        virtual void onStart(Test*) {}
68        virtual void onReport(const char desc[], Result) {}
69        virtual void onEnd(Test*) {}
70
71    private:
72        Test* fCurrTest;
73        int fTestCount;
74        int fResultCount[kLastResult+1];
75        bool fCurrTestSuccess;
76
77        typedef SkRefCnt INHERITED;
78    };
79
80    class Test {
81    public:
82        Test();
83        virtual ~Test();
84
85        Reporter* getReporter() const { return fReporter; }
86        void setReporter(Reporter*);
87
88        const char* getName();
89        bool run(); // returns true on success
90
91        static const SkString& GetTmpDir();
92
93        static const SkString& GetResourcePath();
94
95    protected:
96        virtual void onGetName(SkString*) = 0;
97        virtual void onRun(Reporter*) = 0;
98
99    private:
100        Reporter*   fReporter;
101        SkString    fName;
102    };
103
104    class GpuTest : public Test{
105    public:
106        GpuTest() : Test() {}
107        static GrContextFactory* GetGrContextFactory();
108        static void DestroyContexts();
109    private:
110    };
111
112    typedef SkTRegistry<Test*, void*> TestRegistry;
113}
114
115#define REPORTER_ASSERT(r, cond)                                        \
116    do {                                                                \
117        if (!(cond)) {                                                  \
118            SkString desc;                                              \
119            desc.printf("%s:%d: %s", __FILE__, __LINE__, #cond);        \
120            r->reportFailed(desc);                                      \
121        }                                                               \
122    } while(0)
123
124#define REPORTER_ASSERT_MESSAGE(r, cond, message)                            \
125    do {                                                                     \
126        if (!(cond)) {                                                       \
127            SkString desc;                                                   \
128            desc.printf("%s %s:%d: %s", message, __FILE__, __LINE__, #cond); \
129            r->reportFailed(desc);                                           \
130        }                                                                    \
131    } while(0)
132
133
134#endif
135