2011-07-28 14:26:00 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright 2011 Google Inc.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
|
|
|
*/
|
2009-02-27 16:24:51 +00:00
|
|
|
#ifndef skiatest_Test_DEFINED
|
|
|
|
#define skiatest_Test_DEFINED
|
|
|
|
|
|
|
|
#include "SkString.h"
|
|
|
|
#include "SkTRegistry.h"
|
2013-04-22 16:43:07 +00:00
|
|
|
#include "SkTypes.h"
|
2009-02-27 16:24:51 +00:00
|
|
|
|
2013-02-04 16:13:32 +00:00
|
|
|
class GrContextFactory;
|
Generate list of GPU contexts outside SurfaceTest tests
Add support for feeding the tests with contexts directly to the unit
test framework.
This fixes the problem where tests are more complex than needed just in
order to run the test code with multiple backends.
Also makes it possible to change the logic how contexts are
created. Instead of direct numbering, the different testable contexts
may be generated from filtered cross-product of context options. For
example: currently NVPR is a type of context. However, it could be also
an on/off feature of any context. In order to test this kind of context,
the enumeration can not be just of context type. It's simpler
to move the enumeration out of the tests.
A test targeting both normal and GPU backends would look like:
static void test_obj_behavior(skiatest::Reporter* reporter,
SkObj* obj, [other params] ) {
... test with obj and param ..
}
DEF_TEST(ObjBehavior, reporter) {
for (auto& object : generate_object) {
for (auto& other_param : generate_other_variant) {
test_obj_behavior(reporter, object, other_param);
}
}
}
#if SK_SUPPORT_GPU
DEF_GPUTEST_FOR_ALL_CONTEXTS(ObjBehavior_Gpu, reporter, context) {
for (auto& object : generate_gpu_object) {
for (auto& other_param : generate_other_variant) {
test_obj_behavior(reporter, object, other_param);
}
}
}
#endif
Uses the feature in SurfaceTests as an example.
Moves SkSurface -related tests from ImageTest to SurfaceTest.
BUG=skia:2992
Review URL: https://codereview.chromium.org/1446453003
2015-11-20 21:32:24 +00:00
|
|
|
class GrContext;
|
|
|
|
class SkGLContext;
|
2011-08-16 15:45:58 +00:00
|
|
|
|
2009-02-27 16:24:51 +00:00
|
|
|
namespace skiatest {
|
2009-04-02 16:59:40 +00:00
|
|
|
|
2015-01-20 17:30:20 +00:00
|
|
|
SkString GetTmpDir();
|
|
|
|
|
|
|
|
struct Failure {
|
|
|
|
Failure(const char* f, int l, const char* c, const SkString& m)
|
|
|
|
: fileName(f), lineNo(l), condition(c), message(m) {}
|
|
|
|
const char* fileName;
|
|
|
|
int lineNo;
|
|
|
|
const char* condition;
|
|
|
|
SkString message;
|
|
|
|
SkString toString() const;
|
|
|
|
};
|
|
|
|
|
|
|
|
class Reporter : SkNoncopyable {
|
|
|
|
public:
|
|
|
|
virtual ~Reporter() {}
|
|
|
|
virtual void bumpTestCount();
|
|
|
|
virtual void reportFailed(const skiatest::Failure&) = 0;
|
|
|
|
virtual bool allowExtendedTest() const;
|
|
|
|
virtual bool verbose() const;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define REPORT_FAILURE(reporter, cond, message) \
|
|
|
|
reporter->reportFailed(skiatest::Failure(__FILE__, __LINE__, cond, message))
|
|
|
|
|
|
|
|
typedef void (*TestProc)(skiatest::Reporter*, GrContextFactory*);
|
|
|
|
|
|
|
|
struct Test {
|
|
|
|
Test(const char* n, bool g, TestProc p) : name(n), needsGpu(g), proc(p) {}
|
|
|
|
const char* name;
|
|
|
|
bool needsGpu;
|
|
|
|
TestProc proc;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef SkTRegistry<Test> TestRegistry;
|
2014-01-14 21:04:37 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
Use the following macros to make use of the skiatest classes, e.g.
|
|
|
|
|
|
|
|
#include "Test.h"
|
|
|
|
|
|
|
|
DEF_TEST(TestName, reporter) {
|
|
|
|
...
|
|
|
|
REPORTER_ASSERT(reporter, x == 15);
|
|
|
|
...
|
|
|
|
REPORTER_ASSERT_MESSAGE(reporter, x == 15, "x should be 15");
|
|
|
|
...
|
|
|
|
if (x != 15) {
|
|
|
|
ERRORF(reporter, "x should be 15, but is %d", x);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
...
|
|
|
|
}
|
|
|
|
*/
|
Generate list of GPU contexts outside SurfaceTest tests
Add support for feeding the tests with contexts directly to the unit
test framework.
This fixes the problem where tests are more complex than needed just in
order to run the test code with multiple backends.
Also makes it possible to change the logic how contexts are
created. Instead of direct numbering, the different testable contexts
may be generated from filtered cross-product of context options. For
example: currently NVPR is a type of context. However, it could be also
an on/off feature of any context. In order to test this kind of context,
the enumeration can not be just of context type. It's simpler
to move the enumeration out of the tests.
A test targeting both normal and GPU backends would look like:
static void test_obj_behavior(skiatest::Reporter* reporter,
SkObj* obj, [other params] ) {
... test with obj and param ..
}
DEF_TEST(ObjBehavior, reporter) {
for (auto& object : generate_object) {
for (auto& other_param : generate_other_variant) {
test_obj_behavior(reporter, object, other_param);
}
}
}
#if SK_SUPPORT_GPU
DEF_GPUTEST_FOR_ALL_CONTEXTS(ObjBehavior_Gpu, reporter, context) {
for (auto& object : generate_gpu_object) {
for (auto& other_param : generate_other_variant) {
test_obj_behavior(reporter, object, other_param);
}
}
}
#endif
Uses the feature in SurfaceTests as an example.
Moves SkSurface -related tests from ImageTest to SurfaceTest.
BUG=skia:2992
Review URL: https://codereview.chromium.org/1446453003
2015-11-20 21:32:24 +00:00
|
|
|
enum GPUTestContexts {
|
|
|
|
kNone_GPUTestContexts = 0,
|
|
|
|
kNull_GPUTestContexts = 1,
|
|
|
|
kNative_GPUTestContexts = 1 << 1,
|
|
|
|
kOther_GPUTestContexts = 1 << 2, // Other than native, used only for below.
|
|
|
|
kAllRendering_GPUTestContexts = kNative_GPUTestContexts | kOther_GPUTestContexts,
|
|
|
|
kAll_GPUTestContexts = kAllRendering_GPUTestContexts | kNull_GPUTestContexts
|
|
|
|
};
|
|
|
|
template<typename T>
|
|
|
|
void RunWithGPUTestContexts(T testFunction, GPUTestContexts contexts, Reporter* reporter,
|
|
|
|
GrContextFactory* factory);
|
2015-01-20 17:30:20 +00:00
|
|
|
} // namespace skiatest
|
2009-02-27 16:24:51 +00:00
|
|
|
|
2015-01-20 17:30:20 +00:00
|
|
|
#define REPORTER_ASSERT(r, cond) \
|
|
|
|
do { \
|
|
|
|
if (!(cond)) { \
|
|
|
|
REPORT_FAILURE(r, #cond, SkString()); \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#define REPORTER_ASSERT_MESSAGE(r, cond, message) \
|
|
|
|
do { \
|
|
|
|
if (!(cond)) { \
|
|
|
|
REPORT_FAILURE(r, #cond, SkString(message)); \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#define ERRORF(r, ...) \
|
|
|
|
do { \
|
|
|
|
REPORT_FAILURE(r, "", SkStringPrintf(__VA_ARGS__)); \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#define DEF_TEST(name, reporter) \
|
|
|
|
static void test_##name(skiatest::Reporter*, GrContextFactory*); \
|
|
|
|
skiatest::TestRegistry name##TestRegistry( \
|
|
|
|
skiatest::Test(#name, false, test_##name)); \
|
|
|
|
void test_##name(skiatest::Reporter* reporter, GrContextFactory*)
|
|
|
|
|
Generate list of GPU contexts outside SurfaceTest tests
Add support for feeding the tests with contexts directly to the unit
test framework.
This fixes the problem where tests are more complex than needed just in
order to run the test code with multiple backends.
Also makes it possible to change the logic how contexts are
created. Instead of direct numbering, the different testable contexts
may be generated from filtered cross-product of context options. For
example: currently NVPR is a type of context. However, it could be also
an on/off feature of any context. In order to test this kind of context,
the enumeration can not be just of context type. It's simpler
to move the enumeration out of the tests.
A test targeting both normal and GPU backends would look like:
static void test_obj_behavior(skiatest::Reporter* reporter,
SkObj* obj, [other params] ) {
... test with obj and param ..
}
DEF_TEST(ObjBehavior, reporter) {
for (auto& object : generate_object) {
for (auto& other_param : generate_other_variant) {
test_obj_behavior(reporter, object, other_param);
}
}
}
#if SK_SUPPORT_GPU
DEF_GPUTEST_FOR_ALL_CONTEXTS(ObjBehavior_Gpu, reporter, context) {
for (auto& object : generate_gpu_object) {
for (auto& other_param : generate_other_variant) {
test_obj_behavior(reporter, object, other_param);
}
}
}
#endif
Uses the feature in SurfaceTests as an example.
Moves SkSurface -related tests from ImageTest to SurfaceTest.
BUG=skia:2992
Review URL: https://codereview.chromium.org/1446453003
2015-11-20 21:32:24 +00:00
|
|
|
#define GPUTEST_EXPAND_MSVC(x) x
|
|
|
|
#define GPUTEST_APPLY(C, ...) GPUTEST_EXPAND_MSVC(C(__VA_ARGS__))
|
|
|
|
#define GPUTEST_SELECT(a1, a2, N, ...) N
|
|
|
|
|
|
|
|
#define GPUTEST_CONTEXT_ARGS1(a1) GrContext* a1
|
|
|
|
#define GPUTEST_CONTEXT_ARGS2(a1, a2) GrContext* a1, SkGLContext* a2
|
|
|
|
#define GPUTEST_CONTEXT_ARGS(...) \
|
|
|
|
GPUTEST_APPLY(GPUTEST_SELECT(__VA_ARGS__, GPUTEST_CONTEXT_ARGS2, GPUTEST_CONTEXT_ARGS1), \
|
|
|
|
__VA_ARGS__)
|
|
|
|
|
2015-01-20 17:30:20 +00:00
|
|
|
#define DEF_GPUTEST(name, reporter, factory) \
|
|
|
|
static void test_##name(skiatest::Reporter*, GrContextFactory*); \
|
|
|
|
skiatest::TestRegistry name##TestRegistry( \
|
|
|
|
skiatest::Test(#name, true, test_##name)); \
|
|
|
|
void test_##name(skiatest::Reporter* reporter, GrContextFactory* factory)
|
2014-01-14 21:04:37 +00:00
|
|
|
|
Generate list of GPU contexts outside SurfaceTest tests
Add support for feeding the tests with contexts directly to the unit
test framework.
This fixes the problem where tests are more complex than needed just in
order to run the test code with multiple backends.
Also makes it possible to change the logic how contexts are
created. Instead of direct numbering, the different testable contexts
may be generated from filtered cross-product of context options. For
example: currently NVPR is a type of context. However, it could be also
an on/off feature of any context. In order to test this kind of context,
the enumeration can not be just of context type. It's simpler
to move the enumeration out of the tests.
A test targeting both normal and GPU backends would look like:
static void test_obj_behavior(skiatest::Reporter* reporter,
SkObj* obj, [other params] ) {
... test with obj and param ..
}
DEF_TEST(ObjBehavior, reporter) {
for (auto& object : generate_object) {
for (auto& other_param : generate_other_variant) {
test_obj_behavior(reporter, object, other_param);
}
}
}
#if SK_SUPPORT_GPU
DEF_GPUTEST_FOR_ALL_CONTEXTS(ObjBehavior_Gpu, reporter, context) {
for (auto& object : generate_gpu_object) {
for (auto& other_param : generate_other_variant) {
test_obj_behavior(reporter, object, other_param);
}
}
}
#endif
Uses the feature in SurfaceTests as an example.
Moves SkSurface -related tests from ImageTest to SurfaceTest.
BUG=skia:2992
Review URL: https://codereview.chromium.org/1446453003
2015-11-20 21:32:24 +00:00
|
|
|
#define DEF_GPUTEST_FOR_CONTEXTS(name, contexts, reporter, ...) \
|
|
|
|
static void test_##name(skiatest::Reporter*, GPUTEST_CONTEXT_ARGS(__VA_ARGS__)); \
|
|
|
|
static void test_gpu_contexts_##name(skiatest::Reporter* reporter, \
|
|
|
|
GrContextFactory* factory) { \
|
|
|
|
skiatest::RunWithGPUTestContexts(test_##name, contexts, reporter, factory); \
|
|
|
|
} \
|
|
|
|
skiatest::TestRegistry name##TestRegistry( \
|
|
|
|
skiatest::Test(#name, true, test_gpu_contexts_##name)); \
|
|
|
|
void test_##name(skiatest::Reporter* reporter, GPUTEST_CONTEXT_ARGS(__VA_ARGS__))
|
|
|
|
|
|
|
|
#define DEF_GPUTEST_FOR_ALL_CONTEXTS(name, reporter, ...) \
|
|
|
|
DEF_GPUTEST_FOR_CONTEXTS(name, skiatest::kAll_GPUTestContexts, reporter, __VA_ARGS__)
|
|
|
|
#define DEF_GPUTEST_FOR_RENDERING_CONTEXTS(name, reporter, ...) \
|
|
|
|
DEF_GPUTEST_FOR_CONTEXTS(name, skiatest::kAllRendering_GPUTestContexts, reporter, __VA_ARGS__)
|
|
|
|
#define DEF_GPUTEST_FOR_NULL_CONTEXT(name, reporter, ...) \
|
|
|
|
DEF_GPUTEST_FOR_CONTEXTS(name, skiatest::kNull_GPUTestContexts, reporter, __VA_ARGS__)
|
|
|
|
#define DEF_GPUTEST_FOR_NATIVE_CONTEXT(name, reporter, ...) \
|
|
|
|
DEF_GPUTEST_FOR_CONTEXTS(name, skiatest::kNative_GPUTestContexts, reporter, __VA_ARGS__)
|
|
|
|
|
2015-08-11 20:35:12 +00:00
|
|
|
#define REQUIRE_PDF_DOCUMENT(TEST_NAME, REPORTER) \
|
|
|
|
do { \
|
|
|
|
SkDynamicMemoryWStream testStream; \
|
|
|
|
SkAutoTUnref<SkDocument> testDoc(SkDocument::CreatePDF(&testStream)); \
|
|
|
|
if (!testDoc) { \
|
|
|
|
if ((REPORTER) && (REPORTER)->verbose()) { \
|
|
|
|
SkDebugf("PDF disabled; %s test skipped.", #TEST_NAME); \
|
|
|
|
} \
|
|
|
|
return; \
|
|
|
|
} \
|
|
|
|
} while (false)
|
|
|
|
|
2009-02-27 16:24:51 +00:00
|
|
|
#endif
|