
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
utils#include "SampleCode.h"
#include "SkView.h"
#include "SkCanvas.h"

#include "test.h"

namespace skiatest {
    
class MyReporter : public Reporter {
protected:
    virtual void onStart(Test* test) {}
    virtual void onReport(const char desc[], Reporter::Result result) {
        SkASSERT(Reporter::kPassed == result);
    }
    virtual void onEnd(Test* test) {}
};

class Iter {
public:
    Iter(Reporter* r) : fReporter(r) {
        r->ref();
        fReg = TestRegistry::Head();
    }
    
    ~Iter() {
        fReporter->unref();
    }
    
    Test* next() {
        if (fReg) {
            TestRegistry::Factory fact = fReg->factory();
            fReg = fReg->next();
            Test* test = fact(NULL);
            test->setReporter(fReporter);
            return test;
        }
        return NULL;
    }
    
    static int Count() {
        const TestRegistry* reg = TestRegistry::Head();
        int count = 0;
        while (reg) {
            count += 1;
            reg = reg->next();
        }
        return count;
    }
    
private:
    Reporter* fReporter;
    const TestRegistry* fReg;
};
}

class TestsView : public SkView {
public:
	TestsView() {}

protected:
    // overrides from SkEventSink
    virtual bool onQuery(SkEvent* evt) {
        if (SampleCode::TitleQ(*evt)) {
            SampleCode::TitleR(evt, "Tests");
            return true;
        }
        return this->INHERITED::onQuery(evt);
    }
    
    void drawBG(SkCanvas* canvas) {
        canvas->drawColor(SK_ColorWHITE);
    }
    
    virtual void onDraw(SkCanvas* canvas) {
        this->drawBG(canvas);

        skiatest::MyReporter reporter;
        skiatest::Iter iter(&reporter);
        skiatest::Test* test;
        
        while ((test = iter.next()) != NULL) {
            test->run();
            SkDELETE(test);
        }
    }
    
    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
        this->inval(NULL);
        
        return this->INHERITED::onFindClickHandler(x, y);
    }
    
    virtual bool onClick(Click* click) {
        this->inval(NULL);
        return this->INHERITED::onClick(click);
    }

	virtual bool handleKey(SkKey key) {
        this->inval(NULL);
        return true;
    }

private:
    typedef SkView INHERITED;
};

//////////////////////////////////////////////////////////////////////////////

static SkView* MyFactory() { return new TestsView; }
static SkViewRegister reg(MyFactory);

