1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#ifndef skiatest_Test_DEFINED
9ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#define skiatest_Test_DEFINED
10ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
11ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "SkRefCnt.h"
12ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "SkString.h"
13ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "SkTRegistry.h"
14db60de7cbe3ea9643a0471e1225a6abeac021de3caryclark@google.com#include "SkThread.h"
150506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org#include "SkTypes.h"
16ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
1767b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.comclass GrContextFactory;
18a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com
19ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comnamespace skiatest {
2080e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
21ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    class Test;
22ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
23ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    class Reporter : public SkRefCnt {
24ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    public:
25a22e2117e44efa4298dd0eb6df304a8166c8e9c3robertphillips@google.com        SK_DECLARE_INST_COUNT(Reporter)
26ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        Reporter();
27ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
28ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        int countTests() const { return fTestCount; }
29ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
30ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        void startTest(Test*);
311f7928663f417253f2f75f42625d514dc5f26b9acommit-bot@chromium.org        void reportFailed(const SkString& desc);
32ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        void endTest(Test*);
33c7e08bd6d06a421050ddd7060fbafa5b5e047752commit-bot@chromium.org
34d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com        virtual bool allowExtendedTest() const { return false; }
3516cfe40276bfb0a4d98c9ad995b8e5b134a49b19caryclark@google.com        virtual bool allowThreaded() const { return false; }
3607e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com        virtual bool verbose() const { return false; }
37c7e08bd6d06a421050ddd7060fbafa5b5e047752commit-bot@chromium.org        virtual void bumpTestCount() { sk_atomic_inc(&fTestCount); }
38c7e08bd6d06a421050ddd7060fbafa5b5e047752commit-bot@chromium.org
39ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    protected:
40ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        virtual void onStart(Test*) {}
411f7928663f417253f2f75f42625d514dc5f26b9acommit-bot@chromium.org        virtual void onReportFailed(const SkString& desc) {}
42ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        virtual void onEnd(Test*) {}
4380e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
44ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    private:
45197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org        int32_t fTestCount;
4680e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
47ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        typedef SkRefCnt INHERITED;
48ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    };
4980e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
50ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    class Test {
5180e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com    public:
52ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        Test();
53ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        virtual ~Test();
54ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
55ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        Reporter* getReporter() const { return fReporter; }
56ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        void setReporter(Reporter*);
5780e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
58ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        const char* getName();
59197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org        void run();
60197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org        bool passed() const { return fPassed; }
610506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org        SkMSec elapsedMs() const { return fElapsed; }
6280e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
63c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com        static SkString GetTmpDir();
64cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com
655a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org        virtual bool isGPUTest() const { return false; }
660dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org        virtual void setGrContextFactory(GrContextFactory* factory) {}
67197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
68ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    protected:
69ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        virtual void onGetName(SkString*) = 0;
70ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        virtual void onRun(Reporter*) = 0;
7180e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
72ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    private:
73ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        Reporter*   fReporter;
74ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        SkString    fName;
75197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org        bool        fPassed;
760506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org        SkMSec      fElapsed;
77ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    };
78ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
79a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com    class GpuTest : public Test{
80a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com    public:
810dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org        GpuTest() : Test(), fGrContextFactory(NULL) {}
820dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org
835a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org        virtual bool isGPUTest() const { return true; }
840dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org        virtual void setGrContextFactory(GrContextFactory* factory) {
850dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org            fGrContextFactory = factory;
860dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org        }
870dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org
880dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    protected:
890dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org        GrContextFactory* fGrContextFactory;  // Unowned.
90a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com    };
91a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com
92bd6343b1d60d2a85e930f33f4b06b4502b3e8caamtklein@google.com    typedef SkTRegistry<Test*(*)(void*)> TestRegistry;
93e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org}  // namespace skiatest
94e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
95e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org/*
96e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    Use the following macros to make use of the skiatest classes, e.g.
97e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
98e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    #include "Test.h"
99e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
100e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    DEF_TEST(TestName, reporter) {
101e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
102e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        REPORTER_ASSERT(reporter, x == 15);
103e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
104e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        REPORTER_ASSERT_MESSAGE(reporter, x == 15, "x should be 15");
105e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
106e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        if (x != 15) {
107e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org            ERRORF(reporter, "x should be 15, but is %d", x);
108e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org            return;
109e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        }
110e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
111e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    }
112e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org*/
113ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
114a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com#define REPORTER_ASSERT(r, cond)                                 \
115a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com    do {                                                         \
116a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com        if (!(cond)) {                                           \
117a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com            SkString desc;                                       \
118a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com            desc.printf("%s:%d\t%s", __FILE__, __LINE__, #cond); \
119a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com            r->reportFailed(desc);                               \
120a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com        }                                                        \
121ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    } while(0)
122ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
123a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com#define REPORTER_ASSERT_MESSAGE(r, cond, message)            \
124a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com    do {                                                     \
125a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com        if (!(cond)) {                                       \
126a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com            SkString desc;                                   \
127a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com            desc.printf("%s:%d\t%s: %s", __FILE__, __LINE__, \
128a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com                        message, #cond);                     \
129a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com            r->reportFailed(desc);                           \
130a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com        }                                                    \
1311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org    } while(0)
1321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org
133a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com#define ERRORF(reporter, ...)                       \
134a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com    do {                                            \
135a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com        SkString desc;                              \
136a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com        desc.printf("%s:%d\t", __FILE__, __LINE__); \
137a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com        desc.appendf(__VA_ARGS__) ;                 \
138a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com        (reporter)->reportFailed(desc);             \
139a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com    } while(0)
140ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
141e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org#define DEF_TEST(name, reporter)                                   \
142e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    static void name(skiatest::Reporter*);                         \
143e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    namespace skiatest {                                           \
144e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    class name##Class : public Test {                              \
145e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    public:                                                        \
146e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        static Test* Factory(void*) { return SkNEW(name##Class); } \
147e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    protected:                                                     \
148e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        virtual void onGetName(SkString* name) SK_OVERRIDE {       \
149e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org            name->set(#name);                                      \
150e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        }                                                          \
151e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        virtual void onRun(Reporter* r) SK_OVERRIDE { name(r); }   \
152e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    };                                                             \
153e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    static TestRegistry gReg_##name##Class(name##Class::Factory);  \
154e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    }                                                              \
155e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    static void name(skiatest::Reporter* reporter)
156e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
157e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org#define DEF_GPUTEST(name, reporter, factory)                       \
158e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    static void name(skiatest::Reporter*, GrContextFactory*);      \
159e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    namespace skiatest {                                           \
160e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    class name##Class : public GpuTest {                           \
161e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    public:                                                        \
162e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        static Test* Factory(void*) { return SkNEW(name##Class); } \
163e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    protected:                                                     \
164e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        virtual void onGetName(SkString* name) SK_OVERRIDE {       \
165e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org            name->set(#name);                                      \
166e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        }                                                          \
167e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        virtual void onRun(Reporter* r) SK_OVERRIDE {              \
1680dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org            name(r, fGrContextFactory);                            \
169e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        }                                                          \
170e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    };                                                             \
171e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    static TestRegistry gReg_##name##Class(name##Class::Factory);  \
172e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    }                                                              \
173e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    static void name(skiatest::Reporter* reporter, GrContextFactory* factory)
174e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
175ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#endif
176