skia2/tests/RecordPatternTest.cpp
commit-bot@chromium.org 888e4687d9 Split Star into Star (stores nothing) and List (stores matches).
Just noticed that the cull noop pattern (PushCull, Star<NoOp>, PopCull)
would trigger the Star that stores matches.  We certainly don't need
those matches here, so instead of magically determining which Star you
need, we'll make you tell us which one you want.

No one but List's unit test needs List.  I'll leave it for now, but we
might find it's not useful.

BUG=skia:2378
R=fmalita@chromium.org, mtklein@google.com, bungeman@google.com

Author: mtklein@chromium.org

Review URL: https://codereview.chromium.org/275623002

git-svn-id: http://skia.googlecode.com/svn/trunk@14655 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-05-08 18:58:32 +00:00

200 lines
6.0 KiB
C++

#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));
}