Home | History | Annotate | Download | only in tests
      1 
      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  */
      8 #ifndef skiatest_Test_DEFINED
      9 #define skiatest_Test_DEFINED
     10 
     11 #include "SkRefCnt.h"
     12 #include "SkString.h"
     13 #include "SkTRegistry.h"
     14 #include "SkThread.h"
     15 #include "SkTypes.h"
     16 
     17 class GrContextFactory;
     18 
     19 namespace skiatest {
     20 
     21     class Test;
     22 
     23     class Reporter : public SkRefCnt {
     24     public:
     25         SK_DECLARE_INST_COUNT(Reporter)
     26         Reporter();
     27 
     28         int countTests() const { return fTestCount; }
     29 
     30         void startTest(Test*);
     31         void reportFailed(const SkString& desc);
     32         void endTest(Test*);
     33 
     34         virtual bool allowExtendedTest() const { return false; }
     35         virtual bool allowThreaded() const { return false; }
     36         virtual bool verbose() const { return false; }
     37         virtual void bumpTestCount() { sk_atomic_inc(&fTestCount); }
     38 
     39     protected:
     40         virtual void onStart(Test*) {}
     41         virtual void onReportFailed(const SkString& desc) {}
     42         virtual void onEnd(Test*) {}
     43 
     44     private:
     45         int32_t fTestCount;
     46 
     47         typedef SkRefCnt INHERITED;
     48     };
     49 
     50     class Test {
     51     public:
     52         Test();
     53         virtual ~Test();
     54 
     55         Reporter* getReporter() const { return fReporter; }
     56         void setReporter(Reporter*);
     57 
     58         const char* getName();
     59         void run();
     60         bool passed() const { return fPassed; }
     61         SkMSec elapsedMs() const { return fElapsed; }
     62 
     63         static SkString GetTmpDir();
     64 
     65         static SkString GetResourcePath();
     66 
     67         virtual bool isThreadsafe() const { return true; }
     68 
     69     protected:
     70         virtual void onGetName(SkString*) = 0;
     71         virtual void onRun(Reporter*) = 0;
     72 
     73     private:
     74         Reporter*   fReporter;
     75         SkString    fName;
     76         bool        fPassed;
     77         SkMSec      fElapsed;
     78     };
     79 
     80     class GpuTest : public Test{
     81     public:
     82         GpuTest() : Test() {}
     83         static GrContextFactory* GetGrContextFactory();
     84         static void DestroyContexts();
     85         virtual bool isThreadsafe() const { return false; }
     86     private:
     87     };
     88 
     89     typedef SkTRegistry<Test*(*)(void*)> TestRegistry;
     90 }
     91 
     92 #define REPORTER_ASSERT(r, cond)                                        \
     93     do {                                                                \
     94         if (!(cond)) {                                                  \
     95             SkString desc;                                              \
     96             desc.printf("%s:%d: %s", __FILE__, __LINE__, #cond);        \
     97             r->reportFailed(desc);                                      \
     98         }                                                               \
     99     } while(0)
    100 
    101 #define REPORTER_ASSERT_MESSAGE(r, cond, message)                            \
    102     do {                                                                     \
    103         if (!(cond)) {                                                       \
    104             SkString desc;                                                   \
    105             desc.printf("%s %s:%d: %s", message, __FILE__, __LINE__, #cond); \
    106             r->reportFailed(desc);                                           \
    107         }                                                                    \
    108     } while(0)
    109 
    110 
    111 #endif
    112