skia2/tests/Test.h
commit-bot@chromium.org 0dc5bd149a Let DM run unit tests.
- refactor GYPs and a few flags
  - make GPU tests grab a thread-local GrContextFactory when needed as we do in DM for GMs
  - add a few more UI features to make DM more like tests

I believe this makes the program 'tests' obsolete.

It should be somewhat faster to run the two sets together than running the old binaries serially:
  - serial: tests 20s (3m18s CPU), dm 21s (3m01s CPU)
  - together: 27s (6m21s CPU)

Next up is to incorporate benches.  I'm only planning there on a single-pass sanity check, so that won't obsolete the program 'bench' just yet.

Tested: out/Debug/tests && out/Debug/dm && echo ok
BUG=skia:

Committed: http://code.google.com/p/skia/source/detail?r=13586

R=reed@google.com, bsalomon@google.com, mtklein@google.com, tfarina@chromium.org

Author: mtklein@chromium.org

Review URL: https://codereview.chromium.org/178273002

git-svn-id: http://skia.googlecode.com/svn/trunk@13592 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-02-26 16:31:22 +00:00

179 lines
6.2 KiB
C++

/*
* Copyright 2011 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skiatest_Test_DEFINED
#define skiatest_Test_DEFINED
#include "SkRefCnt.h"
#include "SkString.h"
#include "SkTRegistry.h"
#include "SkThread.h"
#include "SkTypes.h"
class GrContextFactory;
namespace skiatest {
class Test;
class Reporter : public SkRefCnt {
public:
SK_DECLARE_INST_COUNT(Reporter)
Reporter();
int countTests() const { return fTestCount; }
void startTest(Test*);
void reportFailed(const SkString& desc);
void endTest(Test*);
virtual bool allowExtendedTest() const { return false; }
virtual bool allowThreaded() const { return false; }
virtual bool verbose() const { return false; }
virtual void bumpTestCount() { sk_atomic_inc(&fTestCount); }
protected:
virtual void onStart(Test*) {}
virtual void onReportFailed(const SkString& desc) {}
virtual void onEnd(Test*) {}
private:
int32_t fTestCount;
typedef SkRefCnt INHERITED;
};
class Test {
public:
Test();
virtual ~Test();
Reporter* getReporter() const { return fReporter; }
void setReporter(Reporter*);
const char* getName();
void run();
bool passed() const { return fPassed; }
SkMSec elapsedMs() const { return fElapsed; }
static SkString GetTmpDir();
static void SetResourcePath(const char*);
static SkString GetResourcePath();
virtual bool isGPUTest() const { return false; }
virtual void setGrContextFactory(GrContextFactory* factory) {}
protected:
virtual void onGetName(SkString*) = 0;
virtual void onRun(Reporter*) = 0;
private:
Reporter* fReporter;
SkString fName;
bool fPassed;
SkMSec fElapsed;
};
class GpuTest : public Test{
public:
GpuTest() : Test(), fGrContextFactory(NULL) {}
virtual bool isGPUTest() const { return true; }
virtual void setGrContextFactory(GrContextFactory* factory) {
fGrContextFactory = factory;
}
protected:
GrContextFactory* fGrContextFactory; // Unowned.
};
typedef SkTRegistry<Test*(*)(void*)> TestRegistry;
} // namespace skiatest
/*
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;
}
...
}
*/
#define REPORTER_ASSERT(r, cond) \
do { \
if (!(cond)) { \
SkString desc; \
desc.printf("%s:%d\t%s", __FILE__, __LINE__, #cond); \
r->reportFailed(desc); \
} \
} while(0)
#define REPORTER_ASSERT_MESSAGE(r, cond, message) \
do { \
if (!(cond)) { \
SkString desc; \
desc.printf("%s:%d\t%s: %s", __FILE__, __LINE__, \
message, #cond); \
r->reportFailed(desc); \
} \
} while(0)
#define ERRORF(reporter, ...) \
do { \
SkString desc; \
desc.printf("%s:%d\t", __FILE__, __LINE__); \
desc.appendf(__VA_ARGS__) ; \
(reporter)->reportFailed(desc); \
} while(0)
#define DEF_TEST(name, reporter) \
static void name(skiatest::Reporter*); \
namespace skiatest { \
class name##Class : public Test { \
public: \
static Test* Factory(void*) { return SkNEW(name##Class); } \
protected: \
virtual void onGetName(SkString* name) SK_OVERRIDE { \
name->set(#name); \
} \
virtual void onRun(Reporter* r) SK_OVERRIDE { name(r); } \
}; \
static TestRegistry gReg_##name##Class(name##Class::Factory); \
} \
static void name(skiatest::Reporter* reporter)
#define DEF_GPUTEST(name, reporter, factory) \
static void name(skiatest::Reporter*, GrContextFactory*); \
namespace skiatest { \
class name##Class : public GpuTest { \
public: \
static Test* Factory(void*) { return SkNEW(name##Class); } \
protected: \
virtual void onGetName(SkString* name) SK_OVERRIDE { \
name->set(#name); \
} \
virtual void onRun(Reporter* r) SK_OVERRIDE { \
name(r, fGrContextFactory); \
} \
}; \
static TestRegistry gReg_##name##Class(name##Class::Factory); \
} \
static void name(skiatest::Reporter* reporter, GrContextFactory* factory)
#endif