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 #include "SkGraphics.h"
      9 #include "Test.h"
     10 
     11 using namespace skiatest;
     12 
     13 // need to explicitly declare this, or we get some weird infinite loop llist
     14 template TestRegistry* TestRegistry::gHead;
     15 
     16 class Iter {
     17 public:
     18     Iter(Reporter* r) : fReporter(r) {
     19         r->ref();
     20         fReg = TestRegistry::Head();
     21     }
     22 
     23     ~Iter() {
     24         fReporter->unref();
     25     }
     26 
     27     Test* next() {
     28         if (fReg) {
     29             TestRegistry::Factory fact = fReg->factory();
     30             fReg = fReg->next();
     31             Test* test = fact(NULL);
     32             test->setReporter(fReporter);
     33             return test;
     34         }
     35         return NULL;
     36     }
     37 
     38     static int Count() {
     39         const TestRegistry* reg = TestRegistry::Head();
     40         int count = 0;
     41         while (reg) {
     42             count += 1;
     43             reg = reg->next();
     44         }
     45         return count;
     46     }
     47 
     48 private:
     49     Reporter* fReporter;
     50     const TestRegistry* fReg;
     51 };
     52 
     53 static const char* result2string(Reporter::Result result) {
     54     return result == Reporter::kPassed ? "passed" : "FAILED";
     55 }
     56 
     57 class DebugfReporter : public Reporter {
     58 public:
     59     DebugfReporter(bool androidMode) : fAndroidMode(androidMode) {}
     60 
     61     void setIndexOfTotal(int index, int total) {
     62         fIndex = index;
     63         fTotal = total;
     64     }
     65 protected:
     66     virtual void onStart(Test* test) {
     67         this->dumpState(test, kStarting_State);
     68     }
     69     virtual void onReport(const char desc[], Reporter::Result result) {
     70         if (!fAndroidMode) {
     71             SkDebugf("\t%s: %s\n", result2string(result), desc);
     72         }
     73     }
     74     virtual void onEnd(Test* test) {
     75         this->dumpState(test, this->getCurrSuccess() ?
     76                         kSucceeded_State : kFailed_State);
     77     }
     78 private:
     79     enum State {
     80         kStarting_State = 1,
     81         kSucceeded_State = 0,
     82         kFailed_State = -2
     83     };
     84 
     85     void dumpState(Test* test, State state) {
     86         if (fAndroidMode) {
     87             SkDebugf("INSTRUMENTATION_STATUS: test=%s\n", test->getName());
     88             SkDebugf("INSTRUMENTATION_STATUS: class=com.skia\n");
     89             SkDebugf("INSTRUMENTATION_STATUS: current=%d\n", fIndex+1);
     90             SkDebugf("INSTRUMENTATION_STATUS: numtests=%d\n", fTotal);
     91             SkDebugf("INSTRUMENTATION_STATUS_CODE: %d\n", state);
     92         } else {
     93             if (kStarting_State == state) {
     94                 SkDebugf("[%d/%d] %s...\n", fIndex+1, fTotal, test->getName());
     95             } else if (kFailed_State == state) {
     96                 SkDebugf("---- FAILED\n");
     97             }
     98         }
     99     }
    100 
    101     int fIndex, fTotal;
    102     bool fAndroidMode;
    103 };
    104 
    105 int main (int argc, char * const argv[]) {
    106     SkAutoGraphics ag;
    107 
    108     bool androidMode = false;
    109     const char* matchStr = NULL;
    110 
    111     char* const* stop = argv + argc;
    112     for (++argv; argv < stop; ++argv) {
    113         if (strcmp(*argv, "-android") == 0) {
    114             androidMode = true;
    115 
    116         } else if (strcmp(*argv, "--match") == 0) {
    117             ++argv;
    118             if (argv < stop && **argv) {
    119                 matchStr = *argv;
    120             }
    121         }
    122     }
    123 
    124     {
    125         SkString header("Skia UnitTests:");
    126         if (matchStr) {
    127             header.appendf(" --match %s", matchStr);
    128         }
    129 #ifdef SK_DEBUG
    130         header.append(" SK_DEBUG");
    131 #else
    132         header.append(" SK_RELEASE");
    133 #endif
    134 #ifdef SK_SCALAR_IS_FIXED
    135         header.append(" SK_SCALAR_IS_FIXED");
    136 #else
    137         header.append(" SK_SCALAR_IS_FLOAT");
    138 #endif
    139         if (!androidMode) {
    140             SkDebugf("%s\n", header.c_str());
    141         }
    142     }
    143 
    144     DebugfReporter reporter(androidMode);
    145     Iter iter(&reporter);
    146     Test* test;
    147 
    148     const int count = Iter::Count();
    149     int index = 0;
    150     int failCount = 0;
    151     int skipCount = 0;
    152     while ((test = iter.next()) != NULL) {
    153         reporter.setIndexOfTotal(index, count);
    154         if (NULL != matchStr && !strstr(test->getName(), matchStr)) {
    155             ++skipCount;
    156         } else {
    157             if (!test->run()) {
    158                 ++failCount;
    159             }
    160         }
    161         SkDELETE(test);
    162         index += 1;
    163     }
    164 
    165     if (!androidMode) {
    166         SkDebugf("Finished %d tests, %d failures, %d skipped.\n",
    167                  count, failCount, skipCount);
    168     }
    169     return (failCount == 0) ? 0 : 1;
    170 }
    171