11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 8da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#ifndef skiatest_Test_DEFINED 9da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#define skiatest_Test_DEFINED 10da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 11da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#include "SkRefCnt.h" 12da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#include "SkString.h" 13da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#include "SkTRegistry.h" 14da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrContext; 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkGLContext; 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 18da3b8b285a5e3e6f344461d67e3370b27701756dMike Reednamespace skiatest { 19da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 20da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed class Test; 21da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 22da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed class Reporter : public SkRefCnt { 23da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed public: 24da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed Reporter(); 25da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 26da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed enum Result { 27da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed kPassed, // must begin with 0 28da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed kFailed, 29da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed ///// 30da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed kLastResult = kFailed 31da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed }; 32da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 33da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed void resetReporting(); 34da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed int countTests() const { return fTestCount; } 35da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed int countResults(Result r) { 36da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed SkASSERT((unsigned)r <= kLastResult); 37da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed return fResultCount[r]; 38da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed } 39da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 40da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed void startTest(Test*); 41da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed void report(const char testDesc[], Result); 42da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed void endTest(Test*); 43da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 44da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed // helpers for tests 45da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed void assertTrue(bool cond, const char desc[]) { 46da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed if (!cond) { 47da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed this->report(desc, kFailed); 48da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed } 49da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed } 50da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed void assertFalse(bool cond, const char desc[]) { 51da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed if (cond) { 52da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed this->report(desc, kFailed); 53da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed } 54da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed } 55da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed void reportFailed(const char desc[]) { 56da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed this->report(desc, kFailed); 57da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed } 58da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed void reportFailed(const SkString& desc) { 59da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed this->report(desc.c_str(), kFailed); 60da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed } 61f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed 62f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed bool getCurrSuccess() const { 63f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed return fCurrTestSuccess; 64f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed } 65f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed 66da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed protected: 67da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed virtual void onStart(Test*) {} 68da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed virtual void onReport(const char desc[], Result) {} 69da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed virtual void onEnd(Test*) {} 70da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 71da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed private: 72da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed Test* fCurrTest; 73da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed int fTestCount; 74da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed int fResultCount[kLastResult+1]; 75f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed bool fCurrTestSuccess; 76da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 77da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed typedef SkRefCnt INHERITED; 78da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed }; 79da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 80da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed class Test { 81da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed public: 82da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed Test(); 83da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed virtual ~Test(); 84da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 85da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed Reporter* getReporter() const { return fReporter; } 86da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed void setReporter(Reporter*); 87da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 88da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed const char* getName(); 89f95abb54afa5469c53d3ac899ecbce8a386471c1Mike Reed bool run(); // returns true on success 90da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 91da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed protected: 92da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed virtual void onGetName(SkString*) = 0; 93da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed virtual void onRun(Reporter*) = 0; 94da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 95da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed private: 96da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed Reporter* fReporter; 97da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed SkString fName; 98da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed }; 99da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger class GpuTest : public Test{ 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger public: 1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GpuTest() : Test() { 1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger fContext = GetContext(); 1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger protected: 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrContext* fContext; 1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger private: 1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static GrContext* GetContext(); 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 111da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed typedef SkTRegistry<Test*, void*> TestRegistry; 112da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed} 113da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 114da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#define REPORTER_ASSERT(r, cond) \ 115da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed do { \ 116da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed if (!(cond)) { \ 117da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed SkString desc; \ 1184f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger desc.printf("%s:%d: %s", __FILE__, __LINE__, #cond); \ 119da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed r->reportFailed(desc); \ 120da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed } \ 121da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed } while(0) 122da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 1234f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#define REPORTER_ASSERT_MESSAGE(r, cond, message) \ 1244f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger do { \ 1254f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger if (!(cond)) { \ 1264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkString desc; \ 1274f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger desc.printf("%s %s:%d: %s", message, __FILE__, __LINE__, #cond); \ 1284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger r->reportFailed(desc); \ 1294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } \ 1304f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } while(0) 1314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 132da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed 133da3b8b285a5e3e6f344461d67e3370b27701756dMike Reed#endif 134