blob: c27f12012a627a1e011623bf7f149832245f33ee [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
reed@android.comed673312009-02-27 16:24:51 +00008#ifndef skiatest_Test_DEFINED
9#define skiatest_Test_DEFINED
10
11#include "SkRefCnt.h"
12#include "SkString.h"
13#include "SkTRegistry.h"
14
15namespace skiatest {
reed@android.com80e39a72009-04-02 16:59:40 +000016
reed@android.comed673312009-02-27 16:24:51 +000017 class Test;
18
19 class Reporter : public SkRefCnt {
20 public:
21 Reporter();
22
23 enum Result {
24 kPassed, // must begin with 0
25 kFailed,
26 /////
27 kLastResult = kFailed
28 };
reed@android.com80e39a72009-04-02 16:59:40 +000029
reed@android.comed673312009-02-27 16:24:51 +000030 void resetReporting();
31 int countTests() const { return fTestCount; }
32 int countResults(Result r) {
33 SkASSERT((unsigned)r <= kLastResult);
34 return fResultCount[r];
35 }
36
37 void startTest(Test*);
38 void report(const char testDesc[], Result);
39 void endTest(Test*);
reed@android.com80e39a72009-04-02 16:59:40 +000040
reed@android.comed673312009-02-27 16:24:51 +000041 // helpers for tests
42 void assertTrue(bool cond, const char desc[]) {
43 if (!cond) {
44 this->report(desc, kFailed);
45 }
46 }
47 void assertFalse(bool cond, const char desc[]) {
48 if (cond) {
49 this->report(desc, kFailed);
50 }
51 }
52 void reportFailed(const char desc[]) {
53 this->report(desc, kFailed);
54 }
55 void reportFailed(const SkString& desc) {
56 this->report(desc.c_str(), kFailed);
57 }
reed@android.comeeb3b7f2009-04-09 04:06:54 +000058
59 bool getCurrSuccess() const {
60 return fCurrTestSuccess;
61 }
62
reed@android.comed673312009-02-27 16:24:51 +000063 protected:
64 virtual void onStart(Test*) {}
65 virtual void onReport(const char desc[], Result) {}
66 virtual void onEnd(Test*) {}
reed@android.com80e39a72009-04-02 16:59:40 +000067
reed@android.comed673312009-02-27 16:24:51 +000068 private:
69 Test* fCurrTest;
70 int fTestCount;
71 int fResultCount[kLastResult+1];
reed@android.comeeb3b7f2009-04-09 04:06:54 +000072 bool fCurrTestSuccess;
reed@android.com80e39a72009-04-02 16:59:40 +000073
reed@android.comed673312009-02-27 16:24:51 +000074 typedef SkRefCnt INHERITED;
75 };
reed@android.com80e39a72009-04-02 16:59:40 +000076
reed@android.comed673312009-02-27 16:24:51 +000077 class Test {
reed@android.com80e39a72009-04-02 16:59:40 +000078 public:
reed@android.comed673312009-02-27 16:24:51 +000079 Test();
80 virtual ~Test();
81
82 Reporter* getReporter() const { return fReporter; }
83 void setReporter(Reporter*);
reed@android.com80e39a72009-04-02 16:59:40 +000084
reed@android.comed673312009-02-27 16:24:51 +000085 const char* getName();
reed@android.comeeb3b7f2009-04-09 04:06:54 +000086 bool run(); // returns true on success
reed@android.com80e39a72009-04-02 16:59:40 +000087
reed@android.comed673312009-02-27 16:24:51 +000088 protected:
89 virtual void onGetName(SkString*) = 0;
90 virtual void onRun(Reporter*) = 0;
reed@android.com80e39a72009-04-02 16:59:40 +000091
reed@android.comed673312009-02-27 16:24:51 +000092 private:
93 Reporter* fReporter;
94 SkString fName;
95 };
96
97 typedef SkTRegistry<Test*, void*> TestRegistry;
98}
99
100#define REPORTER_ASSERT(r, cond) \
101 do { \
102 if (!(cond)) { \
103 SkString desc; \
104 desc.printf("%s:%d: %s", __FILE__, __LINE__, #cond); \
105 r->reportFailed(desc); \
106 } \
107 } while(0)
108
109
110#endif