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