Test.h revision 179a8f5f7feab052e24596d0d04ab5cf2ccab5e0
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 "SkString.h"
12ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "SkTRegistry.h"
130506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org#include "SkTypes.h"
14ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
1567b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.comclass GrContextFactory;
16179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunenclass GrContext;
17179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunenclass SkGLContext;
18a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com
19ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comnamespace skiatest {
2080e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
2187f3ba4847aa575016eb3a21e944197d757df8c0halcanarySkString GetTmpDir();
2287f3ba4847aa575016eb3a21e944197d757df8c0halcanary
2387f3ba4847aa575016eb3a21e944197d757df8c0halcanarystruct Failure {
2487f3ba4847aa575016eb3a21e944197d757df8c0halcanary    Failure(const char* f, int l, const char* c, const SkString& m)
2587f3ba4847aa575016eb3a21e944197d757df8c0halcanary        : fileName(f), lineNo(l), condition(c), message(m) {}
2687f3ba4847aa575016eb3a21e944197d757df8c0halcanary    const char* fileName;
2787f3ba4847aa575016eb3a21e944197d757df8c0halcanary    int lineNo;
2887f3ba4847aa575016eb3a21e944197d757df8c0halcanary    const char* condition;
2987f3ba4847aa575016eb3a21e944197d757df8c0halcanary    SkString message;
3087f3ba4847aa575016eb3a21e944197d757df8c0halcanary    SkString toString() const;
3187f3ba4847aa575016eb3a21e944197d757df8c0halcanary};
3287f3ba4847aa575016eb3a21e944197d757df8c0halcanary
3387f3ba4847aa575016eb3a21e944197d757df8c0halcanaryclass Reporter : SkNoncopyable {
3487f3ba4847aa575016eb3a21e944197d757df8c0halcanarypublic:
3587f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual ~Reporter() {}
3687f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual void bumpTestCount();
3787f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual void reportFailed(const skiatest::Failure&) = 0;
3887f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual bool allowExtendedTest() const;
3987f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual bool verbose() const;
4087f3ba4847aa575016eb3a21e944197d757df8c0halcanary};
4187f3ba4847aa575016eb3a21e944197d757df8c0halcanary
4287f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define REPORT_FAILURE(reporter, cond, message) \
4387f3ba4847aa575016eb3a21e944197d757df8c0halcanary    reporter->reportFailed(skiatest::Failure(__FILE__, __LINE__, cond, message))
4487f3ba4847aa575016eb3a21e944197d757df8c0halcanary
4587f3ba4847aa575016eb3a21e944197d757df8c0halcanarytypedef void (*TestProc)(skiatest::Reporter*, GrContextFactory*);
4687f3ba4847aa575016eb3a21e944197d757df8c0halcanary
4787f3ba4847aa575016eb3a21e944197d757df8c0halcanarystruct Test {
4887f3ba4847aa575016eb3a21e944197d757df8c0halcanary    Test(const char* n, bool g, TestProc p) : name(n), needsGpu(g), proc(p) {}
4987f3ba4847aa575016eb3a21e944197d757df8c0halcanary    const char* name;
5087f3ba4847aa575016eb3a21e944197d757df8c0halcanary    bool needsGpu;
5187f3ba4847aa575016eb3a21e944197d757df8c0halcanary    TestProc proc;
5287f3ba4847aa575016eb3a21e944197d757df8c0halcanary};
5387f3ba4847aa575016eb3a21e944197d757df8c0halcanary
5487f3ba4847aa575016eb3a21e944197d757df8c0halcanarytypedef SkTRegistry<Test> TestRegistry;
55e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
56e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org/*
57e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    Use the following macros to make use of the skiatest classes, e.g.
58e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
59e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    #include "Test.h"
60e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
61e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    DEF_TEST(TestName, reporter) {
62e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
63e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        REPORTER_ASSERT(reporter, x == 15);
64e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
65e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        REPORTER_ASSERT_MESSAGE(reporter, x == 15, "x should be 15");
66e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
67e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        if (x != 15) {
68e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org            ERRORF(reporter, "x should be 15, but is %d", x);
69e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org            return;
70e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        }
71e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
72e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    }
73e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org*/
74179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunenenum GPUTestContexts {
75179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen    kNone_GPUTestContexts         = 0,
76179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen    kNull_GPUTestContexts         = 1,
77179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen    kNative_GPUTestContexts       = 1 << 1,
78179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen    kOther_GPUTestContexts        = 1 << 2, // Other than native, used only for below.
79179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen    kAllRendering_GPUTestContexts = kNative_GPUTestContexts | kOther_GPUTestContexts,
80179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen    kAll_GPUTestContexts          = kAllRendering_GPUTestContexts | kNull_GPUTestContexts
81179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen};
82179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunentemplate<typename T>
83179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunenvoid RunWithGPUTestContexts(T testFunction, GPUTestContexts contexts, Reporter* reporter,
84179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen                            GrContextFactory* factory);
8587f3ba4847aa575016eb3a21e944197d757df8c0halcanary}  // namespace skiatest
86ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
8787f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define REPORTER_ASSERT(r, cond)                  \
8887f3ba4847aa575016eb3a21e944197d757df8c0halcanary    do {                                          \
8987f3ba4847aa575016eb3a21e944197d757df8c0halcanary        if (!(cond)) {                            \
9087f3ba4847aa575016eb3a21e944197d757df8c0halcanary            REPORT_FAILURE(r, #cond, SkString()); \
9187f3ba4847aa575016eb3a21e944197d757df8c0halcanary        }                                         \
9287f3ba4847aa575016eb3a21e944197d757df8c0halcanary    } while (0)
9387f3ba4847aa575016eb3a21e944197d757df8c0halcanary
9487f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define REPORTER_ASSERT_MESSAGE(r, cond, message)        \
9587f3ba4847aa575016eb3a21e944197d757df8c0halcanary    do {                                                 \
9687f3ba4847aa575016eb3a21e944197d757df8c0halcanary        if (!(cond)) {                                   \
9787f3ba4847aa575016eb3a21e944197d757df8c0halcanary            REPORT_FAILURE(r, #cond, SkString(message)); \
9887f3ba4847aa575016eb3a21e944197d757df8c0halcanary        }                                                \
9987f3ba4847aa575016eb3a21e944197d757df8c0halcanary    } while (0)
10087f3ba4847aa575016eb3a21e944197d757df8c0halcanary
10187f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define ERRORF(r, ...)                                      \
10287f3ba4847aa575016eb3a21e944197d757df8c0halcanary    do {                                                    \
10387f3ba4847aa575016eb3a21e944197d757df8c0halcanary        REPORT_FAILURE(r, "", SkStringPrintf(__VA_ARGS__)); \
10487f3ba4847aa575016eb3a21e944197d757df8c0halcanary    } while (0)
10587f3ba4847aa575016eb3a21e944197d757df8c0halcanary
10687f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define DEF_TEST(name, reporter)                                     \
10787f3ba4847aa575016eb3a21e944197d757df8c0halcanary    static void test_##name(skiatest::Reporter*, GrContextFactory*); \
10887f3ba4847aa575016eb3a21e944197d757df8c0halcanary    skiatest::TestRegistry name##TestRegistry(                       \
10987f3ba4847aa575016eb3a21e944197d757df8c0halcanary            skiatest::Test(#name, false, test_##name));              \
11087f3ba4847aa575016eb3a21e944197d757df8c0halcanary    void test_##name(skiatest::Reporter* reporter, GrContextFactory*)
11187f3ba4847aa575016eb3a21e944197d757df8c0halcanary
112179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen#define GPUTEST_EXPAND_MSVC(x) x
113179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen#define GPUTEST_APPLY(C, ...) GPUTEST_EXPAND_MSVC(C(__VA_ARGS__))
114179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen#define GPUTEST_SELECT(a1, a2, N, ...) N
115179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen
116179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen#define GPUTEST_CONTEXT_ARGS1(a1) GrContext* a1
117179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen#define GPUTEST_CONTEXT_ARGS2(a1, a2) GrContext* a1, SkGLContext* a2
118179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen#define GPUTEST_CONTEXT_ARGS(...)                                                            \
119179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen    GPUTEST_APPLY(GPUTEST_SELECT(__VA_ARGS__, GPUTEST_CONTEXT_ARGS2, GPUTEST_CONTEXT_ARGS1), \
120179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen                  __VA_ARGS__)
121179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen
12287f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define DEF_GPUTEST(name, reporter, factory)                         \
12387f3ba4847aa575016eb3a21e944197d757df8c0halcanary    static void test_##name(skiatest::Reporter*, GrContextFactory*); \
12487f3ba4847aa575016eb3a21e944197d757df8c0halcanary    skiatest::TestRegistry name##TestRegistry(                       \
12587f3ba4847aa575016eb3a21e944197d757df8c0halcanary            skiatest::Test(#name, true, test_##name));               \
12687f3ba4847aa575016eb3a21e944197d757df8c0halcanary    void test_##name(skiatest::Reporter* reporter, GrContextFactory* factory)
127e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
128179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen#define DEF_GPUTEST_FOR_CONTEXTS(name, contexts, reporter, ...)                      \
129179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen    static void test_##name(skiatest::Reporter*, GPUTEST_CONTEXT_ARGS(__VA_ARGS__)); \
130179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen    static void test_gpu_contexts_##name(skiatest::Reporter* reporter,               \
131179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen                                         GrContextFactory* factory) {                \
132179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen        skiatest::RunWithGPUTestContexts(test_##name, contexts, reporter, factory);  \
133179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen    }                                                                                \
134179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen    skiatest::TestRegistry name##TestRegistry(                                       \
135179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen            skiatest::Test(#name, true, test_gpu_contexts_##name));                  \
136179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen    void test_##name(skiatest::Reporter* reporter, GPUTEST_CONTEXT_ARGS(__VA_ARGS__))
137179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen
138179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen#define DEF_GPUTEST_FOR_ALL_CONTEXTS(name, reporter, ...) \
139179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen        DEF_GPUTEST_FOR_CONTEXTS(name, skiatest::kAll_GPUTestContexts, reporter, __VA_ARGS__)
140179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen#define DEF_GPUTEST_FOR_RENDERING_CONTEXTS(name, reporter, ...) \
141179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen        DEF_GPUTEST_FOR_CONTEXTS(name, skiatest::kAllRendering_GPUTestContexts, reporter, __VA_ARGS__)
142179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen#define DEF_GPUTEST_FOR_NULL_CONTEXT(name, reporter, ...) \
143179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen        DEF_GPUTEST_FOR_CONTEXTS(name, skiatest::kNull_GPUTestContexts, reporter, __VA_ARGS__)
144179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen#define DEF_GPUTEST_FOR_NATIVE_CONTEXT(name, reporter, ...) \
145179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen        DEF_GPUTEST_FOR_CONTEXTS(name, skiatest::kNative_GPUTestContexts, reporter, __VA_ARGS__)
146179a8f5f7feab052e24596d0d04ab5cf2ccab5e0kkinnunen
1472ccdb636e8618db77be8e05cdacd82c249c6898chalcanary#define REQUIRE_PDF_DOCUMENT(TEST_NAME, REPORTER)                             \
1482ccdb636e8618db77be8e05cdacd82c249c6898chalcanary    do {                                                                      \
1492ccdb636e8618db77be8e05cdacd82c249c6898chalcanary        SkDynamicMemoryWStream testStream;                                    \
1502ccdb636e8618db77be8e05cdacd82c249c6898chalcanary        SkAutoTUnref<SkDocument> testDoc(SkDocument::CreatePDF(&testStream)); \
1512ccdb636e8618db77be8e05cdacd82c249c6898chalcanary        if (!testDoc) {                                                       \
1522ccdb636e8618db77be8e05cdacd82c249c6898chalcanary            if ((REPORTER) && (REPORTER)->verbose()) {                        \
1532ccdb636e8618db77be8e05cdacd82c249c6898chalcanary                SkDebugf("PDF disabled; %s test skipped.", #TEST_NAME);       \
1542ccdb636e8618db77be8e05cdacd82c249c6898chalcanary            }                                                                 \
1552ccdb636e8618db77be8e05cdacd82c249c6898chalcanary            return;                                                           \
1562ccdb636e8618db77be8e05cdacd82c249c6898chalcanary        }                                                                     \
1572ccdb636e8618db77be8e05cdacd82c249c6898chalcanary    } while (false)
1582ccdb636e8618db77be8e05cdacd82c249c6898chalcanary
159ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#endif
160