aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/RecordPatternTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/RecordPatternTest.cpp')
-rw-r--r--tests/RecordPatternTest.cpp192
1 files changed, 192 insertions, 0 deletions
diff --git a/tests/RecordPatternTest.cpp b/tests/RecordPatternTest.cpp
new file mode 100644
index 0000000000..e013150072
--- /dev/null
+++ b/tests/RecordPatternTest.cpp
@@ -0,0 +1,192 @@
+#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));
+ REPORTER_ASSERT(r, pattern.second<SkTDArray<ClipRect*> >()->count() == 0);
+
+ recorder.save();
+ recorder.clipRect(SkRect::MakeWH(300, 200));
+ recorder.restore();
+ REPORTER_ASSERT(r, pattern.match(&record, 2));
+ REPORTER_ASSERT(r, pattern.second<SkTDArray<ClipRect*> >()->count() == 1);
+
+ recorder.save();
+ recorder.clipRect(SkRect::MakeWH(300, 200));
+ recorder.clipRect(SkRect::MakeWH(100, 100));
+ recorder.restore();
+ REPORTER_ASSERT(r, pattern.match(&record, 5));
+ REPORTER_ASSERT(r, pattern.second<SkTDArray<ClipRect*> >()->count() == 2);
+}
+
+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));
+}