blob: 6b0b90101e465b19fa6afc4d282522741455af1b [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"
caryclark@google.comdb60de72013-04-11 12:33:23 +000014#include "SkThread.h"
reed@android.comed673312009-02-27 16:24:51 +000015
bsalomon@google.com67b915d2013-02-04 16:13:32 +000016class GrContextFactory;
bsalomon@google.coma8e686e2011-08-16 15:45:58 +000017
reed@android.comed673312009-02-27 16:24:51 +000018namespace skiatest {
reed@android.com80e39a72009-04-02 16:59:40 +000019
reed@android.comed673312009-02-27 16:24:51 +000020 class Test;
21
22 class Reporter : public SkRefCnt {
23 public:
robertphillips@google.coma22e2112012-08-16 14:58:06 +000024 SK_DECLARE_INST_COUNT(Reporter)
reed@android.comed673312009-02-27 16:24:51 +000025 Reporter();
26
27 enum Result {
28 kPassed, // must begin with 0
29 kFailed,
30 /////
31 kLastResult = kFailed
32 };
reed@android.com80e39a72009-04-02 16:59:40 +000033
reed@android.comed673312009-02-27 16:24:51 +000034 void resetReporting();
caryclark@google.comdb60de72013-04-11 12:33:23 +000035 void bumpTestCount() { sk_atomic_inc(&fTestCount); }
reed@android.comed673312009-02-27 16:24:51 +000036 int countTests() const { return fTestCount; }
37 int countResults(Result r) {
38 SkASSERT((unsigned)r <= kLastResult);
39 return fResultCount[r];
40 }
41
42 void startTest(Test*);
43 void report(const char testDesc[], Result);
44 void endTest(Test*);
caryclark@google.comd54e1e92013-04-10 15:57:31 +000045 virtual bool allowExtendedTest() const { return false; }
caryclark@google.com16cfe402013-04-18 18:47:37 +000046 virtual bool allowThreaded() const { return false; }
reed@android.comed673312009-02-27 16:24:51 +000047 // helpers for tests
48 void assertTrue(bool cond, const char desc[]) {
49 if (!cond) {
50 this->report(desc, kFailed);
51 }
52 }
53 void assertFalse(bool cond, const char desc[]) {
54 if (cond) {
55 this->report(desc, kFailed);
56 }
57 }
58 void reportFailed(const char desc[]) {
59 this->report(desc, kFailed);
60 }
61 void reportFailed(const SkString& desc) {
62 this->report(desc.c_str(), kFailed);
63 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000064
reed@android.comeeb3b7f2009-04-09 04:06:54 +000065 bool getCurrSuccess() const {
66 return fCurrTestSuccess;
67 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000068
reed@android.comed673312009-02-27 16:24:51 +000069 protected:
70 virtual void onStart(Test*) {}
71 virtual void onReport(const char desc[], Result) {}
72 virtual void onEnd(Test*) {}
reed@android.com80e39a72009-04-02 16:59:40 +000073
reed@android.comed673312009-02-27 16:24:51 +000074 private:
75 Test* fCurrTest;
76 int fTestCount;
77 int fResultCount[kLastResult+1];
reed@android.comeeb3b7f2009-04-09 04:06:54 +000078 bool fCurrTestSuccess;
reed@android.com80e39a72009-04-02 16:59:40 +000079
reed@android.comed673312009-02-27 16:24:51 +000080 typedef SkRefCnt INHERITED;
81 };
reed@android.com80e39a72009-04-02 16:59:40 +000082
reed@android.comed673312009-02-27 16:24:51 +000083 class Test {
reed@android.com80e39a72009-04-02 16:59:40 +000084 public:
reed@android.comed673312009-02-27 16:24:51 +000085 Test();
86 virtual ~Test();
87
88 Reporter* getReporter() const { return fReporter; }
89 void setReporter(Reporter*);
reed@android.com80e39a72009-04-02 16:59:40 +000090
reed@android.comed673312009-02-27 16:24:51 +000091 const char* getName();
reed@android.comeeb3b7f2009-04-09 04:06:54 +000092 bool run(); // returns true on success
reed@android.com80e39a72009-04-02 16:59:40 +000093
djsollen@google.comcb626502013-03-20 13:48:20 +000094 static const SkString& GetTmpDir();
95
96 static const SkString& GetResourcePath();
reed@google.com789c6f22013-02-25 20:24:24 +000097
reed@android.comed673312009-02-27 16:24:51 +000098 protected:
99 virtual void onGetName(SkString*) = 0;
100 virtual void onRun(Reporter*) = 0;
reed@android.com80e39a72009-04-02 16:59:40 +0000101
reed@android.comed673312009-02-27 16:24:51 +0000102 private:
103 Reporter* fReporter;
104 SkString fName;
105 };
106
bsalomon@google.coma8e686e2011-08-16 15:45:58 +0000107 class GpuTest : public Test{
108 public:
bsalomon@google.com67b915d2013-02-04 16:13:32 +0000109 GpuTest() : Test() {}
110 static GrContextFactory* GetGrContextFactory();
111 static void DestroyContexts();
bsalomon@google.coma8e686e2011-08-16 15:45:58 +0000112 private:
bsalomon@google.coma8e686e2011-08-16 15:45:58 +0000113 };
114
reed@android.comed673312009-02-27 16:24:51 +0000115 typedef SkTRegistry<Test*, void*> TestRegistry;
116}
117
118#define REPORTER_ASSERT(r, cond) \
119 do { \
120 if (!(cond)) { \
121 SkString desc; \
junov@chromium.org1cc8f6f2012-02-22 21:00:42 +0000122 desc.printf("%s:%d: %s", __FILE__, __LINE__, #cond); \
reed@android.comed673312009-02-27 16:24:51 +0000123 r->reportFailed(desc); \
124 } \
125 } while(0)
126
junov@chromium.org1cc8f6f2012-02-22 21:00:42 +0000127#define REPORTER_ASSERT_MESSAGE(r, cond, message) \
128 do { \
129 if (!(cond)) { \
130 SkString desc; \
131 desc.printf("%s %s:%d: %s", message, __FILE__, __LINE__, #cond); \
132 r->reportFailed(desc); \
133 } \
134 } while(0)
135
reed@android.comed673312009-02-27 16:24:51 +0000136
137#endif