Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(504)

Unified Diff: tests/RecordPatternTest.cpp

Issue 263063002: Add pattern matchers for SkRecord (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: init pointers Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/utils/SkTLogic.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/RecordPatternTest.cpp
diff --git a/tests/RecordPatternTest.cpp b/tests/RecordPatternTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e013150072102d6c23ffd1a70512824ad144a08c
--- /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));
+}
« no previous file with comments | « src/utils/SkTLogic.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698