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;
16a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com
17ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comnamespace skiatest {
1880e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
1987f3ba4847aa575016eb3a21e944197d757df8c0halcanarySkString GetTmpDir();
2087f3ba4847aa575016eb3a21e944197d757df8c0halcanary
2187f3ba4847aa575016eb3a21e944197d757df8c0halcanarystruct Failure {
2287f3ba4847aa575016eb3a21e944197d757df8c0halcanary    Failure(const char* f, int l, const char* c, const SkString& m)
2387f3ba4847aa575016eb3a21e944197d757df8c0halcanary        : fileName(f), lineNo(l), condition(c), message(m) {}
2487f3ba4847aa575016eb3a21e944197d757df8c0halcanary    const char* fileName;
2587f3ba4847aa575016eb3a21e944197d757df8c0halcanary    int lineNo;
2687f3ba4847aa575016eb3a21e944197d757df8c0halcanary    const char* condition;
2787f3ba4847aa575016eb3a21e944197d757df8c0halcanary    SkString message;
2887f3ba4847aa575016eb3a21e944197d757df8c0halcanary    SkString toString() const;
2987f3ba4847aa575016eb3a21e944197d757df8c0halcanary};
3087f3ba4847aa575016eb3a21e944197d757df8c0halcanary
3187f3ba4847aa575016eb3a21e944197d757df8c0halcanaryclass Reporter : SkNoncopyable {
3287f3ba4847aa575016eb3a21e944197d757df8c0halcanarypublic:
3387f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual ~Reporter() {}
3487f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual void bumpTestCount();
3587f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual void reportFailed(const skiatest::Failure&) = 0;
3687f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual bool allowExtendedTest() const;
3787f3ba4847aa575016eb3a21e944197d757df8c0halcanary    virtual bool verbose() const;
3887f3ba4847aa575016eb3a21e944197d757df8c0halcanary};
3987f3ba4847aa575016eb3a21e944197d757df8c0halcanary
4087f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define REPORT_FAILURE(reporter, cond, message) \
4187f3ba4847aa575016eb3a21e944197d757df8c0halcanary    reporter->reportFailed(skiatest::Failure(__FILE__, __LINE__, cond, message))
4287f3ba4847aa575016eb3a21e944197d757df8c0halcanary
4387f3ba4847aa575016eb3a21e944197d757df8c0halcanarytypedef void (*TestProc)(skiatest::Reporter*, GrContextFactory*);
4487f3ba4847aa575016eb3a21e944197d757df8c0halcanary
4587f3ba4847aa575016eb3a21e944197d757df8c0halcanarystruct Test {
4687f3ba4847aa575016eb3a21e944197d757df8c0halcanary    Test(const char* n, bool g, TestProc p) : name(n), needsGpu(g), proc(p) {}
4787f3ba4847aa575016eb3a21e944197d757df8c0halcanary    const char* name;
4887f3ba4847aa575016eb3a21e944197d757df8c0halcanary    bool needsGpu;
4987f3ba4847aa575016eb3a21e944197d757df8c0halcanary    TestProc proc;
5087f3ba4847aa575016eb3a21e944197d757df8c0halcanary};
5187f3ba4847aa575016eb3a21e944197d757df8c0halcanary
5287f3ba4847aa575016eb3a21e944197d757df8c0halcanarytypedef SkTRegistry<Test> TestRegistry;
53e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
54e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org/*
55e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    Use the following macros to make use of the skiatest classes, e.g.
56e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
57e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    #include "Test.h"
58e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
59e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    DEF_TEST(TestName, reporter) {
60e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
61e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        REPORTER_ASSERT(reporter, x == 15);
62e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
63e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        REPORTER_ASSERT_MESSAGE(reporter, x == 15, "x should be 15");
64e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
65e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        if (x != 15) {
66e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org            ERRORF(reporter, "x should be 15, but is %d", x);
67e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org            return;
68e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        }
69e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org        ...
70e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org    }
71e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org*/
7287f3ba4847aa575016eb3a21e944197d757df8c0halcanary}  // namespace skiatest
73ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
7487f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define REPORTER_ASSERT(r, cond)                  \
7587f3ba4847aa575016eb3a21e944197d757df8c0halcanary    do {                                          \
7687f3ba4847aa575016eb3a21e944197d757df8c0halcanary        if (!(cond)) {                            \
7787f3ba4847aa575016eb3a21e944197d757df8c0halcanary            REPORT_FAILURE(r, #cond, SkString()); \
7887f3ba4847aa575016eb3a21e944197d757df8c0halcanary        }                                         \
7987f3ba4847aa575016eb3a21e944197d757df8c0halcanary    } while (0)
8087f3ba4847aa575016eb3a21e944197d757df8c0halcanary
8187f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define REPORTER_ASSERT_MESSAGE(r, cond, message)        \
8287f3ba4847aa575016eb3a21e944197d757df8c0halcanary    do {                                                 \
8387f3ba4847aa575016eb3a21e944197d757df8c0halcanary        if (!(cond)) {                                   \
8487f3ba4847aa575016eb3a21e944197d757df8c0halcanary            REPORT_FAILURE(r, #cond, SkString(message)); \
8587f3ba4847aa575016eb3a21e944197d757df8c0halcanary        }                                                \
8687f3ba4847aa575016eb3a21e944197d757df8c0halcanary    } while (0)
8787f3ba4847aa575016eb3a21e944197d757df8c0halcanary
8887f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define ERRORF(r, ...)                                      \
8987f3ba4847aa575016eb3a21e944197d757df8c0halcanary    do {                                                    \
9087f3ba4847aa575016eb3a21e944197d757df8c0halcanary        REPORT_FAILURE(r, "", SkStringPrintf(__VA_ARGS__)); \
9187f3ba4847aa575016eb3a21e944197d757df8c0halcanary    } while (0)
9287f3ba4847aa575016eb3a21e944197d757df8c0halcanary
9387f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define DEF_TEST(name, reporter)                                     \
9487f3ba4847aa575016eb3a21e944197d757df8c0halcanary    static void test_##name(skiatest::Reporter*, GrContextFactory*); \
9587f3ba4847aa575016eb3a21e944197d757df8c0halcanary    skiatest::TestRegistry name##TestRegistry(                       \
9687f3ba4847aa575016eb3a21e944197d757df8c0halcanary            skiatest::Test(#name, false, test_##name));              \
9787f3ba4847aa575016eb3a21e944197d757df8c0halcanary    void test_##name(skiatest::Reporter* reporter, GrContextFactory*)
9887f3ba4847aa575016eb3a21e944197d757df8c0halcanary
9987f3ba4847aa575016eb3a21e944197d757df8c0halcanary#define DEF_GPUTEST(name, reporter, factory)                         \
10087f3ba4847aa575016eb3a21e944197d757df8c0halcanary    static void test_##name(skiatest::Reporter*, GrContextFactory*); \
10187f3ba4847aa575016eb3a21e944197d757df8c0halcanary    skiatest::TestRegistry name##TestRegistry(                       \
10287f3ba4847aa575016eb3a21e944197d757df8c0halcanary            skiatest::Test(#name, true, test_##name));               \
10387f3ba4847aa575016eb3a21e944197d757df8c0halcanary    void test_##name(skiatest::Reporter* reporter, GrContextFactory* factory)
104e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org
105ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#endif
106