11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
8da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#ifndef skiatest_Test_DEFINED
9da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#define skiatest_Test_DEFINED
10da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
11da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#include "SkRefCnt.h"
12da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#include "SkString.h"
13da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#include "SkTRegistry.h"
14da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrContext;
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkGLContext;
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
18da3b8b285a5e3e6f344461d67e3370b27701756dMike Reednamespace skiatest {
19da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
20da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    class Test;
21da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
22da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    class Reporter : public SkRefCnt {
23da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    public:
24da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        Reporter();
25da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
26da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        enum Result {
27da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            kPassed,    // must begin with 0
28da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            kFailed,
29da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            /////
30da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            kLastResult = kFailed
31da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        };
32da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
33da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        void resetReporting();
34da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        int countTests() const { return fTestCount; }
35da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        int countResults(Result r) {
36da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            SkASSERT((unsigned)r <= kLastResult);
37da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            return fResultCount[r];
38da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        }
39da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
40da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        void startTest(Test*);
41da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        void report(const char testDesc[], Result);
42da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        void endTest(Test*);
43da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
44da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        // helpers for tests
45da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        void assertTrue(bool cond, const char desc[]) {
46da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            if (!cond) {
47da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed                this->report(desc, kFailed);
48da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            }
49da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        }
50da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        void assertFalse(bool cond, const char desc[]) {
51da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            if (cond) {
52da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed                this->report(desc, kFailed);
53da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            }
54da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        }
55da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        void reportFailed(const char desc[]) {
56da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            this->report(desc, kFailed);
57da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        }
58da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        void reportFailed(const SkString& desc) {
59da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            this->report(desc.c_str(), kFailed);
60da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        }
61f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed
62f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed        bool getCurrSuccess() const {
63f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed            return fCurrTestSuccess;
64f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed        }
65f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed
66da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    protected:
67da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        virtual void onStart(Test*) {}
68da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        virtual void onReport(const char desc[], Result) {}
69da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        virtual void onEnd(Test*) {}
70da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
71da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    private:
72da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        Test* fCurrTest;
73da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        int fTestCount;
74da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        int fResultCount[kLastResult+1];
75f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed        bool fCurrTestSuccess;
76da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
77da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        typedef SkRefCnt INHERITED;
78da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    };
79da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
80da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    class Test {
81da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    public:
82da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        Test();
83da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        virtual ~Test();
84da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
85da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        Reporter* getReporter() const { return fReporter; }
86da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        void setReporter(Reporter*);
87da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
88da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        const char* getName();
89f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed        bool run(); // returns true on success
90da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
91da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    protected:
92da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        virtual void onGetName(SkString*) = 0;
93da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        virtual void onRun(Reporter*) = 0;
94da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
95da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    private:
96da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        Reporter*   fReporter;
97da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        SkString    fName;
98da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    };
99da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    class GpuTest : public Test{
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    public:
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GpuTest() : Test() {
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fContext = GetContext();
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    protected:
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrContext* fContext;
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    private:
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static GrContext* GetContext();
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
111da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    typedef SkTRegistry<Test*, void*> TestRegistry;
112da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed}
113da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
114da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#define REPORTER_ASSERT(r, cond)                                        \
115da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    do {                                                                \
116da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        if (!(cond)) {                                                  \
117da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            SkString desc;                                              \
1184f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            desc.printf("%s:%d: %s", __FILE__, __LINE__, #cond);        \
119da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed            r->reportFailed(desc);                                      \
120da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed        }                                                               \
121da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed    } while(0)
122da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
1234f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#define REPORTER_ASSERT_MESSAGE(r, cond, message)                            \
1244f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    do {                                                                     \
1254f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (!(cond)) {                                                       \
1264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            SkString desc;                                                   \
1274f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            desc.printf("%s %s:%d: %s", message, __FILE__, __LINE__, #cond); \
1284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            r->reportFailed(desc);                                           \
1294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        }                                                                    \
1304f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    } while(0)
1314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
132da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed
133da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#endif
134