Index: tests/Test.cpp |
diff --git a/tests/Test.cpp b/tests/Test.cpp |
index 79d3aad58180350dc235fd6abdba8f430dc59516..408e14f6917479c2dd07a472fdd6b47751430922 100644 |
--- a/tests/Test.cpp |
+++ b/tests/Test.cpp |
@@ -7,7 +7,8 @@ |
*/ |
#include "Test.h" |
-#include "SkTLazy.h" |
+#include "SkString.h" |
+#include "SkTArray.h" |
#if SK_SUPPORT_GPU |
#include "GrContext.h" |
@@ -20,45 +21,25 @@ SK_DEFINE_INST_COUNT(skiatest::Reporter) |
using namespace skiatest; |
-Reporter::Reporter() |
- : fTestCount(0) { |
- this->resetReporting(); |
-} |
- |
-void Reporter::resetReporting() { |
- fCurrTest = NULL; |
- fTestCount = 0; |
- sk_bzero(fResultCount, sizeof(fResultCount)); |
+Reporter::Reporter() : fTestCount(0) { |
} |
void Reporter::startTest(Test* test) { |
- SkASSERT(NULL == fCurrTest); |
- fCurrTest = test; |
+ this->bumpTestCount(); |
this->onStart(test); |
- fTestCount += 1; |
- fCurrTestSuccess = true; // we're optimistic |
} |
void Reporter::report(const char desc[], Result result) { |
- if (NULL == desc) { |
- desc = "<no description>"; |
- } |
- this->onReport(desc, result); |
- fResultCount[result] += 1; |
- if (kFailed == result) { |
- fCurrTestSuccess = false; |
- } |
+ this->onReport(desc ? desc : "<no description>", result); |
} |
void Reporter::endTest(Test* test) { |
- SkASSERT(test == fCurrTest); |
this->onEnd(test); |
- fCurrTest = NULL; |
} |
/////////////////////////////////////////////////////////////////////////////// |
-Test::Test() : fReporter(NULL) {} |
+Test::Test() : fReporter(NULL), fPassed(true) {} |
Test::~Test() { |
SkSafeUnref(fReporter); |
@@ -75,11 +56,41 @@ const char* Test::getName() { |
return fName.c_str(); |
} |
-bool Test::run() { |
+namespace { |
+ class LocalReporter : public Reporter { |
+ public: |
+ LocalReporter() {} |
+ |
+ int failure_size() const { return fFailures.count(); } |
+ const char* failure(int i) const { return fFailures[i].c_str(); } |
+ |
+ protected: |
+ void onReport(const char desc[], Result result) SK_OVERRIDE { |
+ if (kFailed == result) { |
+ fFailures.push_back().set(desc); |
+ } |
+ } |
+ |
+ private: |
+ SkTArray<SkString> fFailures; |
+ }; |
+} // namespace |
+ |
+void Test::run() { |
+ // Tell (likely shared) fReporter that this test has started. |
fReporter->startTest(this); |
- this->onRun(fReporter); |
+ |
+ // 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; |
+ this->onRun(&local); |
+ fPassed = local.failure_size() == 0; |
+ |
+ // Now tell fReporter about any failures and wrap up. |
+ for (int i = 0; i < local.failure_size(); i++) { |
+ fReporter->report(local.failure(i), Reporter::kFailed); |
+ } |
fReporter->endTest(this); |
- return fReporter->getCurrSuccess(); |
} |
/////////////////////////////////////////////////////////////////////////////// |