#include "Test.h"

#include "SkRecord.h"
#include "SkRecordPattern.h"
#include "SkRecorder.h"
#include "SkRecords.h"

using namespace SkRecords;
typedef Pattern3<Is<Save>,
                 Is<ClipRect>,
                 Is<Restore> >
    SaveClipRectRestore;

DEF_TEST(RecordPattern_Simple, r) {
    SaveClipRectRestore pattern;

    SkRecord record;
    REPORTER_ASSERT(r, !pattern.match(&record, 0));

    SkRecorder recorder(SkRecorder::kWriteOnly_Mode, &record, 1920, 1200);

    // Build up a save-clip-restore block.  The pattern will match only it's complete.
    recorder.save();
    REPORTER_ASSERT(r, !pattern.match(&record, 0));

    recorder.clipRect(SkRect::MakeWH(300, 200));
    REPORTER_ASSERT(r, !pattern.match(&record, 0));

    recorder.restore();
    REPORTER_ASSERT(r, pattern.match(&record, 0));
    REPORTER_ASSERT(r, pattern.first<Save>()      != NULL);
    REPORTER_ASSERT(r, pattern.second<ClipRect>() != NULL);
    REPORTER_ASSERT(r, pattern.third<Restore>()   != NULL);
}

DEF_TEST(RecordPattern_StartingIndex, r) {
    SaveClipRectRestore pattern;

    SkRecord record;
    SkRecorder recorder(SkRecorder::kWriteOnly_Mode, &record, 1920, 1200);

    // There will be two save-clipRect-restore blocks [0,3) and [3,6).
    for (int i = 0; i < 2; i++) {
        recorder.save();
            recorder.clipRect(SkRect::MakeWH(300, 200));
        recorder.restore();
    }

    // We should match only at 0 and 3.  Going over the length should fail gracefully.
    for (unsigned i = 0; i < 8; i++) {
        if (i == 0 || i == 3) {
            REPORTER_ASSERT(r, pattern.match(&record, i) == i + 3);
        } else {
            REPORTER_ASSERT(r, !pattern.match(&record, i));
        }
    }
}

DEF_TEST(RecordPattern_DontMatchSubsequences, r) {
    SaveClipRectRestore pattern;

    SkRecord record;
    SkRecorder recorder(SkRecorder::kWriteOnly_Mode, &record, 1920, 1200);

    recorder.save();
        recorder.clipRect(SkRect::MakeWH(300, 200));
        recorder.drawRect(SkRect::MakeWH(600, 300), SkPaint());
    recorder.restore();

    REPORTER_ASSERT(r, !pattern.match(&record, 0));
}

DEF_TEST(RecordPattern_Star, r) {
    Pattern3<Is<Save>, Star<Is<ClipRect> >, Is<Restore> > pattern;

    SkRecord record;
    SkRecorder recorder(SkRecorder::kWriteOnly_Mode, &record, 1920, 1200);

    recorder.save();
    recorder.restore();
    REPORTER_ASSERT(r, pattern.match(&record, 0));

    recorder.save();
        recorder.clipRect(SkRect::MakeWH(300, 200));
    recorder.restore();
    REPORTER_ASSERT(r, pattern.match(&record, 2));

    recorder.save();
        recorder.clipRect(SkRect::MakeWH(300, 200));
        recorder.clipRect(SkRect::MakeWH(100, 100));
    recorder.restore();
    REPORTER_ASSERT(r, pattern.match(&record, 5));
}

DEF_TEST(RecordPattern_IsDraw, r) {
    Pattern3<Is<Save>, IsDraw, Is<Restore> > pattern;

    SkRecord record;
    SkRecorder recorder(SkRecorder::kWriteOnly_Mode, &record, 1920, 1200);

    recorder.save();
        recorder.clipRect(SkRect::MakeWH(300, 200));
    recorder.restore();

    REPORTER_ASSERT(r, !pattern.match(&record, 0));

    SkPaint paint;

    recorder.save();
        paint.setColor(0xEEAA8822);
        recorder.drawRect(SkRect::MakeWH(300, 200), paint);
    recorder.restore();

    recorder.save();
        paint.setColor(0xFACEFACE);
        recorder.drawPaint(paint);
    recorder.restore();

    REPORTER_ASSERT(r, pattern.match(&record, 3));
    REPORTER_ASSERT(r, pattern.first<Save>()    != NULL);
    REPORTER_ASSERT(r, pattern.second<SkPaint>()->getColor() == 0xEEAA8822);
    REPORTER_ASSERT(r, pattern.third<Restore>() != NULL);

    REPORTER_ASSERT(r, pattern.match(&record, 6));
    REPORTER_ASSERT(r, pattern.first<Save>()    != NULL);
    REPORTER_ASSERT(r, pattern.second<SkPaint>()->getColor() == 0xFACEFACE);
    REPORTER_ASSERT(r, pattern.third<Restore>() != NULL);
}

DEF_TEST(RecordPattern_Complex, r) {
    Pattern3<Is<Save>,
             Star<Not<Or3<Is<Save>,
                          Is<Restore>,
                          IsDraw> > >,
             Is<Restore> > pattern;

    SkRecord record;
    SkRecorder recorder(SkRecorder::kWriteOnly_Mode, &record, 1920, 1200);

    recorder.save();
    recorder.restore();
    REPORTER_ASSERT(r, pattern.match(&record, 0) == 2);

    recorder.save();
        recorder.save();
        recorder.restore();
    recorder.restore();
    REPORTER_ASSERT(r, !pattern.match(&record, 2));
    REPORTER_ASSERT(r, pattern.match(&record, 3) == 5);

    recorder.save();
        recorder.clipRect(SkRect::MakeWH(300, 200));
    recorder.restore();
    REPORTER_ASSERT(r, pattern.match(&record, 6) == 9);

    recorder.save();
        recorder.clipRect(SkRect::MakeWH(300, 200));
        recorder.drawRect(SkRect::MakeWH(100, 3000), SkPaint());
    recorder.restore();
    REPORTER_ASSERT(r, !pattern.match(&record, 9));

    recorder.save();
        recorder.pushCull(SkRect::MakeWH(300, 200));
        recorder.clipRect(SkRect::MakeWH(300, 200));
        recorder.clipRect(SkRect::MakeWH(100, 400));
        recorder.popCull();
    recorder.restore();
    REPORTER_ASSERT(r, pattern.match(&record, 13) == 19);

    // Same as above, but using pattern.search to step through matches.
    unsigned begin, end = 0;
    REPORTER_ASSERT(r, pattern.search(&record, &begin, &end));
    REPORTER_ASSERT(r, begin == 0);
    REPORTER_ASSERT(r, end == 2);

    REPORTER_ASSERT(r, pattern.search(&record, &begin, &end));
    REPORTER_ASSERT(r, begin == 3);
    REPORTER_ASSERT(r, end == 5);

    REPORTER_ASSERT(r, pattern.search(&record, &begin, &end));
    REPORTER_ASSERT(r, begin == 6);
    REPORTER_ASSERT(r, end == 9);

    REPORTER_ASSERT(r, pattern.search(&record, &begin, &end));
    REPORTER_ASSERT(r, begin == 13);
    REPORTER_ASSERT(r, end == 19);

    REPORTER_ASSERT(r, !pattern.search(&record, &begin, &end));
}

DEF_TEST(RecordPattern_SaveLayerIsNotADraw, r) {
    Pattern1<IsDraw> pattern;

    SkRecord record;
    SkRecorder recorder(SkRecorder::kWriteOnly_Mode, &record, 1920, 1200);
    recorder.saveLayer(NULL, NULL);

    REPORTER_ASSERT(r, !pattern.match(&record, 0));
}
