skia2/tests/Test.cpp
caryclark@google.com 8d0a524a48 harden and speed up path op unit tests
PathOps tests internal routines direcctly. Check to make sure that
test points, lines, quads, curves, triangles, and bounds read from
arrays are valid (i.e., don't contain NaN) before calling the
test function.

Repurpose the test flags.
- make 'v' verbose test region output against path output
- make 'z' single threaded (before it made it multithreaded)

The latter change speeds up tests run by the buildbot by 2x to 3x.

BUG=

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

git-svn-id: http://skia.googlecode.com/svn/trunk@10107 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-07-16 16:11:16 +00:00

141 lines
3.3 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.
*/
#include "Test.h"
#include "SkString.h"
#include "SkTArray.h"
#include "SkTime.h"
#include "SkError.h"
#if SK_SUPPORT_GPU
#include "GrContext.h"
#include "gl/SkNativeGLContext.h"
#else
class GrContext;
#endif
SK_DEFINE_INST_COUNT(skiatest::Reporter)
using namespace skiatest;
Reporter::Reporter() : fTestCount(0) {
}
void Reporter::startTest(Test* test) {
this->bumpTestCount();
this->onStart(test);
}
void Reporter::reportFailed(const SkString& desc) {
this->onReportFailed(desc);
}
void Reporter::endTest(Test* test) {
this->onEnd(test);
}
///////////////////////////////////////////////////////////////////////////////
Test::Test() : fReporter(NULL), fPassed(true) {}
Test::~Test() {
SkSafeUnref(fReporter);
}
void Test::setReporter(Reporter* r) {
SkRefCnt_SafeAssign(fReporter, r);
}
const char* Test::getName() {
if (fName.size() == 0) {
this->onGetName(&fName);
}
return fName.c_str();
}
namespace {
class LocalReporter : public Reporter {
public:
explicit LocalReporter(Reporter* reporterToMimic) : fReporter(reporterToMimic) {}
int failure_size() const { return fFailures.count(); }
const SkString& failure(int i) const { return fFailures[i]; }
protected:
void onReportFailed(const SkString& desc) SK_OVERRIDE {
fFailures.push_back(desc);
}
// Proxy down to fReporter. We assume these calls are threadsafe.
virtual bool allowExtendedTest() const SK_OVERRIDE {
return fReporter->allowExtendedTest();
}
virtual bool allowThreaded() const SK_OVERRIDE {
return fReporter->allowThreaded();
}
virtual void bumpTestCount() SK_OVERRIDE {
fReporter->bumpTestCount();
}
virtual bool verbose() const SK_OVERRIDE {
return fReporter->verbose();
}
private:
Reporter* fReporter; // Unowned.
SkTArray<SkString> fFailures;
};
} // namespace
void Test::run() {
// Clear the Skia error callback before running any test, to ensure that tests
// don't have unintended side effects when running more than one.
SkSetErrorCallback( NULL, NULL );
// Tell (likely shared) fReporter that this test has started.
fReporter->startTest(this);
const SkMSec start = SkTime::GetMSecs();
// Run the test into a LocalReporter so we know if it's passed or failed without interference
// from other tests that might share fReporter.
LocalReporter local(fReporter);
this->onRun(&local);
fPassed = local.failure_size() == 0;
fElapsed = SkTime::GetMSecs() - start;
// Now tell fReporter about any failures and wrap up.
for (int i = 0; i < local.failure_size(); i++) {
fReporter->reportFailed(local.failure(i));
}
fReporter->endTest(this);
}
///////////////////////////////////////////////////////////////////////////////
#if SK_SUPPORT_GPU
#include "GrContextFactory.h"
GrContextFactory gGrContextFactory;
#endif
GrContextFactory* GpuTest::GetGrContextFactory() {
#if SK_SUPPORT_GPU
return &gGrContextFactory;
#else
return NULL;
#endif
}
void GpuTest::DestroyContexts() {
#if SK_SUPPORT_GPU
gGrContextFactory.destroyContexts();
#endif
}