Test.h revision a8e686eb6cadb74039d3b624ece0d3ccb0684dcc
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 GrContext;
16class SkEGLContext;
17
18namespace skiatest {
19
20    class Test;
21
22    class Reporter : public SkRefCnt {
23    public:
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    protected:
92        virtual void onGetName(SkString*) = 0;
93        virtual void onRun(Reporter*) = 0;
94
95    private:
96        Reporter*   fReporter;
97        SkString    fName;
98    };
99
100    class GpuTest : public Test{
101    public:
102        GpuTest() : Test() {
103            fContext = GetContext();
104        }
105    protected:
106        GrContext* fContext;
107    private:
108        static GrContext* GetContext();
109    };
110
111    typedef SkTRegistry<Test*, void*> TestRegistry;
112}
113
114#define REPORTER_ASSERT(r, cond)                                        \
115    do {                                                                \
116        if (!(cond)) {                                                  \
117            SkString desc;                                              \
118            desc.printf("%s:%d: %s", __FILE__, __LINE__, #cond);      \
119            r->reportFailed(desc);                                      \
120        }                                                               \
121    } while(0)
122
123
124#endif
125