1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#ifndef skiatest_Test_DEFINED
8ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#define skiatest_Test_DEFINED
9ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
10ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "SkString.h"
11ab273facbfe496a3d5dd798e6b4b57c41eed7f16Mike Reed#include "../tools/Registry.h"
120506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org#include "SkTypes.h"
13ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reed#include "SkClipOpPriv.h"
14ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
15f2f1c17e331fe1e0ce695969970ecebc81e12cebbsalomon#if SK_SUPPORT_GPU
16f2f1c17e331fe1e0ce695969970ecebc81e12cebbsalomon#include "GrContextFactory.h"
17f2f1c17e331fe1e0ce695969970ecebc81e12cebbsalomon#else
183724e574a744491b7cfb8187ac865a70ef3d4528bsalomonnamespace sk_gpu_test {
1967b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.comclass GrContextFactory;
20f2f1c17e331fe1e0ce695969970ecebc81e12cebbsalomonclass ContextInfo;
21273c0f5e87397c40d22bb7e3ee078bb46a3f6860bsalomonclass GLTestContext;
223724e574a744491b7cfb8187ac865a70ef3d4528bsalomon}  // namespace sk_gpu_test
23179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunenclass GrContext;
24f2f1c17e331fe1e0ce695969970ecebc81e12cebbsalomon#endif
25a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com
26ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comnamespace skiatest {
2780e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
2887f3ba4847aa575016eb3a21e944197d757df8c0halcanarySkString GetTmpDir();
2987f3ba4847aa575016eb3a21e944197d757df8c0halcanary
3087f3ba4847aa575016eb3a21e944197d757df8c0halcanarystruct Failure {
3187f3ba4847aa575016eb3a21e944197d757df8c0halcanary    Failure(const char* f, int l, const char* c, const SkString& m)
3287f3ba4847aa575016eb3a21e944197d757df8c0halcanary        : fileName(f), lineNo(l), condition(c), message(m) {}
3387f3ba4847aa575016eb3a21e944197d757df8c0halcanary    const char* fileName;
3487f3ba4847aa575016eb3a21e944197d757df8c0halcanary    int lineNo;
3587f3ba4847aa575016eb3a21e944197d757df8c0halcanary    const char* condition;
3687f3ba4847aa575016eb3a21e944197d757df8c0halcanary    SkString message;
3787f3ba4847aa575016eb3a21e944197d757df8c0halcanary    SkString toString() const;
3887f3ba4847aa575016eb3a21e944197d757df8c0halcanary};
3987f3ba4847aa575016eb3a21e944197d757df8c0halcanary
4087f3ba4847aa575016eb3a21e944197d757df8c0halcanaryclass Reporter : SkNoncopyable {
4187f3ba4847aa575016eb3a21e944197d757df8c0halcanarypublic:
4287f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual ~Reporter() {}
4387f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual void bumpTestCount();
4487f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual void reportFailed(const skiatest::Failure&) = 0;
4587f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual bool allowExtendedTest() const;
4687f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual bool verbose() const;
47ab87d7abf1df007c90bef2e916294ca325d81c81Cary Clark    virtual void* stats() const { return nullptr; }
48287f6512f34d456b593ea030197925dfc5b15c65Brian Osman
49287f6512f34d456b593ea030197925dfc5b15c65Brian Osman    void reportFailedWithContext(const skiatest::Failure& f) {
50287f6512f34d456b593ea030197925dfc5b15c65Brian Osman        SkString fullMessage = f.message;
51287f6512f34d456b593ea030197925dfc5b15c65Brian Osman        if (!fContextStack.empty()) {
52287f6512f34d456b593ea030197925dfc5b15c65Brian Osman            fullMessage.append(" [");
53287f6512f34d456b593ea030197925dfc5b15c65Brian Osman            for (int i = 0; i < fContextStack.count(); ++i) {
54287f6512f34d456b593ea030197925dfc5b15c65Brian Osman                if (i > 0) {
55287f6512f34d456b593ea030197925dfc5b15c65Brian Osman                    fullMessage.append(", ");
56287f6512f34d456b593ea030197925dfc5b15c65Brian Osman                }
57287f6512f34d456b593ea030197925dfc5b15c65Brian Osman                fullMessage.append(fContextStack[i]);
58287f6512f34d456b593ea030197925dfc5b15c65Brian Osman            }
59287f6512f34d456b593ea030197925dfc5b15c65Brian Osman            fullMessage.append("]");
60287f6512f34d456b593ea030197925dfc5b15c65Brian Osman        }
61287f6512f34d456b593ea030197925dfc5b15c65Brian Osman        this->reportFailed(skiatest::Failure(f.fileName, f.lineNo, f.condition, fullMessage));
62287f6512f34d456b593ea030197925dfc5b15c65Brian Osman    }
63287f6512f34d456b593ea030197925dfc5b15c65Brian Osman    void push(const SkString& message) {
64287f6512f34d456b593ea030197925dfc5b15c65Brian Osman        fContextStack.push_back(message);
65287f6512f34d456b593ea030197925dfc5b15c65Brian Osman    }
66287f6512f34d456b593ea030197925dfc5b15c65Brian Osman    void pop() {
67287f6512f34d456b593ea030197925dfc5b15c65Brian Osman        fContextStack.pop_back();
68287f6512f34d456b593ea030197925dfc5b15c65Brian Osman    }
69287f6512f34d456b593ea030197925dfc5b15c65Brian Osman
70287f6512f34d456b593ea030197925dfc5b15c65Brian Osmanprivate:
71287f6512f34d456b593ea030197925dfc5b15c65Brian Osman    SkTArray<SkString> fContextStack;
7287f3ba4847aa575016eb3a21e944197d757df8c0halcanary};
7387f3ba4847aa575016eb3a21e944197d757df8c0halcanary
7487f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define REPORT_FAILURE(reporter, cond, message) \
75287f6512f34d456b593ea030197925dfc5b15c65Brian Osman    reporter->reportFailedWithContext(skiatest::Failure(__FILE__, __LINE__, cond, message))
76287f6512f34d456b593ea030197925dfc5b15c65Brian Osman
77287f6512f34d456b593ea030197925dfc5b15c65Brian Osmanclass ReporterContext : SkNoncopyable {
78287f6512f34d456b593ea030197925dfc5b15c65Brian Osmanpublic:
79287f6512f34d456b593ea030197925dfc5b15c65Brian Osman    ReporterContext(Reporter* reporter, const SkString& message) : fReporter(reporter) {
80287f6512f34d456b593ea030197925dfc5b15c65Brian Osman        fReporter->push(message);
81287f6512f34d456b593ea030197925dfc5b15c65Brian Osman    }
82287f6512f34d456b593ea030197925dfc5b15c65Brian Osman    ~ReporterContext() {
83287f6512f34d456b593ea030197925dfc5b15c65Brian Osman        fReporter->pop();
84287f6512f34d456b593ea030197925dfc5b15c65Brian Osman    }
85287f6512f34d456b593ea030197925dfc5b15c65Brian Osman
86287f6512f34d456b593ea030197925dfc5b15c65Brian Osmanprivate:
87287f6512f34d456b593ea030197925dfc5b15c65Brian Osman    Reporter* fReporter;
88287f6512f34d456b593ea030197925dfc5b15c65Brian Osman};
8987f3ba4847aa575016eb3a21e944197d757df8c0halcanary
903724e574a744491b7cfb8187ac865a70ef3d4528bsalomontypedef void (*TestProc)(skiatest::Reporter*, sk_gpu_test::GrContextFactory*);
9187f3ba4847aa575016eb3a21e944197d757df8c0halcanary
9287f3ba4847aa575016eb3a21e944197d757df8c0halcanarystruct Test {
9387f3ba4847aa575016eb3a21e944197d757df8c0halcanary    Test(const char* n, bool g, TestProc p) : name(n), needsGpu(g), proc(p) {}
9487f3ba4847aa575016eb3a21e944197d757df8c0halcanary    const char* name;
9587f3ba4847aa575016eb3a21e944197d757df8c0halcanary    bool needsGpu;
9687f3ba4847aa575016eb3a21e944197d757df8c0halcanary    TestProc proc;
9787f3ba4847aa575016eb3a21e944197d757df8c0halcanary};
9887f3ba4847aa575016eb3a21e944197d757df8c0halcanary
99ab273facbfe496a3d5dd798e6b4b57c41eed7f16Mike Reedtypedef sk_tools::Registry<Test> TestRegistry;
100e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
101e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org/*
102e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    Use the following macros to make use of the skiatest classes, e.g.
103e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
104e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    #include "Test.h"
105e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
106e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    DEF_TEST(TestName, reporter) {
107e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
108e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        REPORTER_ASSERT(reporter, x == 15);
109e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
110e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        REPORTER_ASSERT_MESSAGE(reporter, x == 15, "x should be 15");
111e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
112e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        if (x != 15) {
113e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org            ERRORF(reporter, "x should be 15, but is %d", x);
114e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org            return;
115e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        }
116e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
117e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    }
118e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org*/
119758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomon
120758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomon#if SK_SUPPORT_GPU
121758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomonusing GrContextFactoryContextType = sk_gpu_test::GrContextFactory::ContextType;
122758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomon#else
123758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomonusing GrContextFactoryContextType = int;
124758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomon#endif
125f2f1c17e331fe1e0ce695969970ecebc81e12cebbsalomon
126f2f1c17e331fe1e0ce695969970ecebc81e12cebbsalomontypedef void GrContextTestFn(Reporter*, const sk_gpu_test::ContextInfo&);
127758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomontypedef bool GrContextTypeFilterFn(GrContextFactoryContextType);
128758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomon
129758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomonextern bool IsGLContextType(GrContextFactoryContextType);
130dc0fcd41e75682a8bfd5e285d684461475226330bsalomonextern bool IsVulkanContextType(GrContextFactoryContextType);
131758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomonextern bool IsRenderingGLContextType(GrContextFactoryContextType);
132758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomonextern bool IsNullGLContextType(GrContextFactoryContextType);
133758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomonvoid RunWithGPUTestContexts(GrContextTestFn*, GrContextTypeFilterFn*,
134758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomon                            Reporter*, sk_gpu_test::GrContextFactory*);
135ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner
136ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner/** Timer provides wall-clock duration since its creation. */
137ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagnerclass Timer {
138ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagnerpublic:
139ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner    /** Starts the timer. */
140ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner    Timer();
141ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner
142ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner    /** Nanoseconds since creation. */
143ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner    double elapsedNs() const;
144ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner
145ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner    /** Milliseconds since creation. */
146ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner    double elapsedMs() const;
147ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner
148ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner    /** Milliseconds since creation as an integer.
149ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner        Behavior is undefined for durations longer than SK_MSecMax.
150ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner    */
151ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner    SkMSec elapsedMsInt() const;
152ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagnerprivate:
153ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner    double fStartNanos;
154ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner};
155ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner
15687f3ba4847aa575016eb3a21e944197d757df8c0halcanary}  // namespace skiatest
157ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
15887f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define REPORTER_ASSERT(r, cond)                  \
15987f3ba4847aa575016eb3a21e944197d757df8c0halcanary    do {                                          \
16087f3ba4847aa575016eb3a21e944197d757df8c0halcanary        if (!(cond)) {                            \
16187f3ba4847aa575016eb3a21e944197d757df8c0halcanary            REPORT_FAILURE(r, #cond, SkString()); \
16287f3ba4847aa575016eb3a21e944197d757df8c0halcanary        }                                         \
16387f3ba4847aa575016eb3a21e944197d757df8c0halcanary    } while (0)
16487f3ba4847aa575016eb3a21e944197d757df8c0halcanary
16587f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define REPORTER_ASSERT_MESSAGE(r, cond, message)        \
16687f3ba4847aa575016eb3a21e944197d757df8c0halcanary    do {                                                 \
16787f3ba4847aa575016eb3a21e944197d757df8c0halcanary        if (!(cond)) {                                   \
16887f3ba4847aa575016eb3a21e944197d757df8c0halcanary            REPORT_FAILURE(r, #cond, SkString(message)); \
16987f3ba4847aa575016eb3a21e944197d757df8c0halcanary        }                                                \
17087f3ba4847aa575016eb3a21e944197d757df8c0halcanary    } while (0)
17187f3ba4847aa575016eb3a21e944197d757df8c0halcanary
17287f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define ERRORF(r, ...)                                      \
17387f3ba4847aa575016eb3a21e944197d757df8c0halcanary    do {                                                    \
17487f3ba4847aa575016eb3a21e944197d757df8c0halcanary        REPORT_FAILURE(r, "", SkStringPrintf(__VA_ARGS__)); \
17587f3ba4847aa575016eb3a21e944197d757df8c0halcanary    } while (0)
17687f3ba4847aa575016eb3a21e944197d757df8c0halcanary
1777d57124a2a9ed7b271568fb75b3cfd949fdb313ahalcanary#define INFOF(REPORTER, ...)         \
1787d57124a2a9ed7b271568fb75b3cfd949fdb313ahalcanary    do {                             \
1797d57124a2a9ed7b271568fb75b3cfd949fdb313ahalcanary        if ((REPORTER)->verbose()) { \
1807d57124a2a9ed7b271568fb75b3cfd949fdb313ahalcanary            SkDebugf(__VA_ARGS__);   \
1817d57124a2a9ed7b271568fb75b3cfd949fdb313ahalcanary        }                            \
1827d57124a2a9ed7b271568fb75b3cfd949fdb313ahalcanary    } while (0)
1837d57124a2a9ed7b271568fb75b3cfd949fdb313ahalcanary
1843724e574a744491b7cfb8187ac865a70ef3d4528bsalomon#define DEF_TEST(name, reporter)                                                  \
1853724e574a744491b7cfb8187ac865a70ef3d4528bsalomon    static void test_##name(skiatest::Reporter*, sk_gpu_test::GrContextFactory*); \
1863724e574a744491b7cfb8187ac865a70ef3d4528bsalomon    skiatest::TestRegistry name##TestRegistry(                                    \
1873724e574a744491b7cfb8187ac865a70ef3d4528bsalomon            skiatest::Test(#name, false, test_##name));                           \
1883724e574a744491b7cfb8187ac865a70ef3d4528bsalomon    void test_##name(skiatest::Reporter* reporter, sk_gpu_test::GrContextFactory*)
18987f3ba4847aa575016eb3a21e944197d757df8c0halcanary
190179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen
191f2f1c17e331fe1e0ce695969970ecebc81e12cebbsalomon#define DEF_GPUTEST(name, reporter, factory)                                                 \
192f2f1c17e331fe1e0ce695969970ecebc81e12cebbsalomon    static void test_##name(skiatest::Reporter*, sk_gpu_test::GrContextFactory*);            \
193f2f1c17e331fe1e0ce695969970ecebc81e12cebbsalomon    skiatest::TestRegistry name##TestRegistry(                                               \
194f2f1c17e331fe1e0ce695969970ecebc81e12cebbsalomon            skiatest::Test(#name, true, test_##name));                                       \
1953724e574a744491b7cfb8187ac865a70ef3d4528bsalomon    void test_##name(skiatest::Reporter* reporter, sk_gpu_test::GrContextFactory* factory)
196e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
197fda880710c28a1b0ff0c8c88f90a7659a7ce553fbsalomon#define DEF_GPUTEST_FOR_CONTEXTS(name, context_filter, reporter, context_info)            \
198fda880710c28a1b0ff0c8c88f90a7659a7ce553fbsalomon    static void test_##name(skiatest::Reporter*,                                          \
199fda880710c28a1b0ff0c8c88f90a7659a7ce553fbsalomon                            const sk_gpu_test::ContextInfo& context_info);                \
200fda880710c28a1b0ff0c8c88f90a7659a7ce553fbsalomon    static void test_gpu_contexts_##name(skiatest::Reporter* reporter,                    \
201fda880710c28a1b0ff0c8c88f90a7659a7ce553fbsalomon                                         sk_gpu_test::GrContextFactory* factory) {        \
202fda880710c28a1b0ff0c8c88f90a7659a7ce553fbsalomon        skiatest::RunWithGPUTestContexts(test_##name, context_filter, reporter, factory); \
203fda880710c28a1b0ff0c8c88f90a7659a7ce553fbsalomon    }                                                                                     \
204fda880710c28a1b0ff0c8c88f90a7659a7ce553fbsalomon    skiatest::TestRegistry name##TestRegistry(                                            \
205fda880710c28a1b0ff0c8c88f90a7659a7ce553fbsalomon            skiatest::Test(#name, true, test_gpu_contexts_##name));                       \
206fda880710c28a1b0ff0c8c88f90a7659a7ce553fbsalomon    void test_##name(skiatest::Reporter* reporter,                                        \
207f2f1c17e331fe1e0ce695969970ecebc81e12cebbsalomon                     const sk_gpu_test::ContextInfo& context_info)
208f2f1c17e331fe1e0ce695969970ecebc81e12cebbsalomon
209fda880710c28a1b0ff0c8c88f90a7659a7ce553fbsalomon#define DEF_GPUTEST_FOR_ALL_CONTEXTS(name, reporter, context_info)                          \
210fda880710c28a1b0ff0c8c88f90a7659a7ce553fbsalomon        DEF_GPUTEST_FOR_CONTEXTS(name, nullptr, reporter, context_info)
21168d9134bec16e91c4a6cde071bcaa579bc0801a7bsalomon#define DEF_GPUTEST_FOR_RENDERING_CONTEXTS(name, reporter, context_info)                    \
21268d9134bec16e91c4a6cde071bcaa579bc0801a7bsalomon        DEF_GPUTEST_FOR_CONTEXTS(name, sk_gpu_test::GrContextFactory::IsRenderingContext,   \
21368d9134bec16e91c4a6cde071bcaa579bc0801a7bsalomon                                 reporter, context_info)
214758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomon#define DEF_GPUTEST_FOR_ALL_GL_CONTEXTS(name, reporter, context_info)                       \
215758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomon        DEF_GPUTEST_FOR_CONTEXTS(name, &skiatest::IsGLContextType, reporter, context_info)
216758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomon#define DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(name, reporter, context_info)                 \
217758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomon        DEF_GPUTEST_FOR_CONTEXTS(name, &skiatest::IsRenderingGLContextType, reporter, context_info)
218758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomon#define DEF_GPUTEST_FOR_NULLGL_CONTEXT(name, reporter, context_info)                        \
219758586c7f11a6b3529bd4a1c9b4e982a0d0b0582bsalomon        DEF_GPUTEST_FOR_CONTEXTS(name, &skiatest::IsNullGLContextType, reporter, context_info)
220dc0fcd41e75682a8bfd5e285d684461475226330bsalomon#define DEF_GPUTEST_FOR_VULKAN_CONTEXT(name, reporter, context_info)                        \
221dc0fcd41e75682a8bfd5e285d684461475226330bsalomon        DEF_GPUTEST_FOR_CONTEXTS(name, &skiatest::IsVulkanContextType, reporter, context_info)
222179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen
2234b6566644f704cf9e30c71fa547c9b5915752792halcanary#define REQUIRE_PDF_DOCUMENT(TEST_NAME, REPORTER)                          \
2244b6566644f704cf9e30c71fa547c9b5915752792halcanary    do {                                                                   \
2254b6566644f704cf9e30c71fa547c9b5915752792halcanary        SkDynamicMemoryWStream testStream;                                 \
2264b6566644f704cf9e30c71fa547c9b5915752792halcanary        sk_sp<SkDocument> testDoc(SkDocument::MakePDF(&testStream));       \
2274b6566644f704cf9e30c71fa547c9b5915752792halcanary        if (!testDoc) {                                                    \
2284b6566644f704cf9e30c71fa547c9b5915752792halcanary            INFOF(REPORTER, "PDF disabled; %s test skipped.", #TEST_NAME); \
2294b6566644f704cf9e30c71fa547c9b5915752792halcanary            return;                                                        \
2304b6566644f704cf9e30c71fa547c9b5915752792halcanary        }                                                                  \
2312ccdb636e8618db77be8e05cdacd82c249c6898chalcanary    } while (false)
2322ccdb636e8618db77be8e05cdacd82c249c6898chalcanary
233ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#endif
234