Home | History | Annotate | Download | only in tests
      1 #include "SkGraphics.h"
      2 #include "Test.h"
      3 
      4 using namespace skiatest;
      5 
      6 // need to explicitly declare this, or we get some weird infinite loop llist
      7 template TestRegistry* TestRegistry::gHead;
      8 
      9 class Iter {
     10 public:
     11     Iter(Reporter* r) : fReporter(r) {
     12         r->ref();
     13         fReg = TestRegistry::Head();
     14     }
     15 
     16     ~Iter() {
     17         fReporter->unref();
     18     }
     19 
     20     Test* next() {
     21         if (fReg) {
     22             TestRegistry::Factory fact = fReg->factory();
     23             fReg = fReg->next();
     24             Test* test = fact(NULL);
     25             test->setReporter(fReporter);
     26             return test;
     27         }
     28         return NULL;
     29     }
     30 
     31     static int Count() {
     32         const TestRegistry* reg = TestRegistry::Head();
     33         int count = 0;
     34         while (reg) {
     35             count += 1;
     36             reg = reg->next();
     37         }
     38         return count;
     39     }
     40 
     41 private:
     42     Reporter* fReporter;
     43     const TestRegistry* fReg;
     44 };
     45 
     46 static const char* result2string(Reporter::Result result) {
     47     return result == Reporter::kPassed ? "passed" : "FAILED";
     48 }
     49 
     50 class DebugfReporter : public Reporter {
     51 public:
     52     DebugfReporter(bool androidMode) : fAndroidMode(androidMode) {}
     53 
     54     void setIndexOfTotal(int index, int total) {
     55         fIndex = index;
     56         fTotal = total;
     57     }
     58 protected:
     59     virtual void onStart(Test* test) {
     60         this->dumpState(test, kStarting_State);
     61     }
     62     virtual void onReport(const char desc[], Reporter::Result result) {
     63         if (!fAndroidMode) {
     64             SkDebugf("\t%s: %s\n", result2string(result), desc);
     65         }
     66     }
     67     virtual void onEnd(Test* test) {
     68         this->dumpState(test, this->getCurrSuccess() ?
     69                         kSucceeded_State : kFailed_State);
     70     }
     71 private:
     72     enum State {
     73         kStarting_State = 1,
     74         kSucceeded_State = 0,
     75         kFailed_State = -2
     76     };
     77 
     78     void dumpState(Test* test, State state) {
     79         if (fAndroidMode) {
     80             SkDebugf("INSTRUMENTATION_STATUS: test=%s\n", test->getName());
     81             SkDebugf("INSTRUMENTATION_STATUS: class=com.skia\n");
     82             SkDebugf("INSTRUMENTATION_STATUS: current=%d\n", fIndex+1);
     83             SkDebugf("INSTRUMENTATION_STATUS: numtests=%d\n", fTotal);
     84             SkDebugf("INSTRUMENTATION_STATUS_CODE: %d\n", state);
     85         } else {
     86             if (kStarting_State == state) {
     87                 SkDebugf("[%d/%d] %s...\n", fIndex+1, fTotal, test->getName());
     88             } else if (kFailed_State == state) {
     89                 SkDebugf("---- FAILED\n");
     90             }
     91         }
     92     }
     93 
     94     int fIndex, fTotal;
     95     bool fAndroidMode;
     96 };
     97 
     98 int main (int argc, char * const argv[]) {
     99     SkAutoGraphics ag;
    100 
    101     bool androidMode = false;
    102     for (int i = 1; i < argc; i++) {
    103         if (!strcmp(argv[i], "-android")) {
    104             androidMode = true;
    105         }
    106     }
    107 
    108     DebugfReporter reporter(androidMode);
    109     Iter iter(&reporter);
    110     Test* test;
    111 
    112     const int count = Iter::Count();
    113     int index = 0;
    114     int successCount = 0;
    115     while ((test = iter.next()) != NULL) {
    116         reporter.setIndexOfTotal(index, count);
    117         successCount += test->run();
    118         SkDELETE(test);
    119         index += 1;
    120     }
    121 
    122     if (!androidMode) {
    123         SkDebugf("Finished %d tests, %d failures.\n", count,
    124                  count - successCount);
    125     }
    126     return 0;
    127 }
    128