Test.h revision 0dc5bd149a8b69e8dc6d3b4713b827659c9b0a6b
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 650dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org static void SetResourcePath(const char*); 66c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com static SkString GetResourcePath(); 67789c6f291ecfff925086015360da525d6de1c835reed@google.com 685a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org virtual bool isGPUTest() const { return false; } 690dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org virtual void setGrContextFactory(GrContextFactory* factory) {} 70197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org 71ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com protected: 72ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com virtual void onGetName(SkString*) = 0; 73ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com virtual void onRun(Reporter*) = 0; 7480e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 75ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com private: 76ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com Reporter* fReporter; 77ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com SkString fName; 78197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org bool fPassed; 790506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org SkMSec fElapsed; 80ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com }; 81ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 82a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com class GpuTest : public Test{ 83a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com public: 840dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org GpuTest() : Test(), fGrContextFactory(NULL) {} 850dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org 865a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org virtual bool isGPUTest() const { return true; } 870dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org virtual void setGrContextFactory(GrContextFactory* factory) { 880dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org fGrContextFactory = factory; 890dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org } 900dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org 910dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org protected: 920dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org GrContextFactory* fGrContextFactory; // Unowned. 93a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com }; 94a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com 95bd6343b1d60d2a85e930f33f4b06b4502b3e8caamtklein@google.com typedef SkTRegistry<Test*(*)(void*)> TestRegistry; 96e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org} // namespace skiatest 97e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org 98e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org/* 99e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org Use the following macros to make use of the skiatest classes, e.g. 100e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org 101e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org #include "Test.h" 102e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org 103e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org DEF_TEST(TestName, reporter) { 104e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org ... 105e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org REPORTER_ASSERT(reporter, x == 15); 106e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org ... 107e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org REPORTER_ASSERT_MESSAGE(reporter, x == 15, "x should be 15"); 108e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org ... 109e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org if (x != 15) { 110e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org ERRORF(reporter, "x should be 15, but is %d", x); 111e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org return; 112e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org } 113e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org ... 114e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org } 115e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org*/ 116ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 117a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com#define REPORTER_ASSERT(r, cond) \ 118a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com do { \ 119a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com if (!(cond)) { \ 120a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com SkString desc; \ 121a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com desc.printf("%s:%d\t%s", __FILE__, __LINE__, #cond); \ 122a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com r->reportFailed(desc); \ 123a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com } \ 124ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com } while(0) 125ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 126a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com#define REPORTER_ASSERT_MESSAGE(r, cond, message) \ 127a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com do { \ 128a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com if (!(cond)) { \ 129a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com SkString desc; \ 130a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com desc.printf("%s:%d\t%s: %s", __FILE__, __LINE__, \ 131a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com message, #cond); \ 132a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com r->reportFailed(desc); \ 133a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com } \ 1341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } while(0) 1351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 136a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com#define ERRORF(reporter, ...) \ 137a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com do { \ 138a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com SkString desc; \ 139a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com desc.printf("%s:%d\t", __FILE__, __LINE__); \ 140a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com desc.appendf(__VA_ARGS__) ; \ 141a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com (reporter)->reportFailed(desc); \ 142a9325fa237dde2654bc841c2bb0a05fc3e57696ahalcanary@google.com } while(0) 143ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 144e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org#define DEF_TEST(name, reporter) \ 145e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org static void name(skiatest::Reporter*); \ 146e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org namespace skiatest { \ 147e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org class name##Class : public Test { \ 148e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org public: \ 149e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org static Test* Factory(void*) { return SkNEW(name##Class); } \ 150e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org protected: \ 151e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org virtual void onGetName(SkString* name) SK_OVERRIDE { \ 152e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org name->set(#name); \ 153e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org } \ 154e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org virtual void onRun(Reporter* r) SK_OVERRIDE { name(r); } \ 155e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org }; \ 156e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org static TestRegistry gReg_##name##Class(name##Class::Factory); \ 157e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org } \ 158e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org static void name(skiatest::Reporter* reporter) 159e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org 160e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org#define DEF_GPUTEST(name, reporter, factory) \ 161e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org static void name(skiatest::Reporter*, GrContextFactory*); \ 162e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org namespace skiatest { \ 163e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org class name##Class : public GpuTest { \ 164e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org public: \ 165e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org static Test* Factory(void*) { return SkNEW(name##Class); } \ 166e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org protected: \ 167e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org virtual void onGetName(SkString* name) SK_OVERRIDE { \ 168e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org name->set(#name); \ 169e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org } \ 170e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org virtual void onRun(Reporter* r) SK_OVERRIDE { \ 1710dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org name(r, fGrContextFactory); \ 172e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org } \ 173e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org }; \ 174e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org static TestRegistry gReg_##name##Class(name##Class::Factory); \ 175e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org } \ 176e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org static void name(skiatest::Reporter* reporter, GrContextFactory* factory) 177e2eac8b2fd8966cc9af51f8d40151dad6c591d2ecommit-bot@chromium.org 178ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#endif 179