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