1 #include "Test.h"
2 
3 #include "SkRecord.h"
4 #include "SkRecordPattern.h"
5 #include "SkRecorder.h"
6 #include "SkRecords.h"
7 
8 using namespace SkRecords;
9 typedef Pattern3<Is<Save>,
10                  Is<ClipRect>,
11                  Is<Restore> >
12     SaveClipRectRestore;
13 
DEF_TEST(RecordPattern_Simple,r)14 DEF_TEST(RecordPattern_Simple, r) {
15     SaveClipRectRestore pattern;
16 
17     SkRecord record;
18     REPORTER_ASSERT(r, !pattern.match(&record, 0));
19 
20     SkRecorder recorder(&record, 1920, 1200);
21 
22     // Build up a save-clip-restore block.  The pattern will match only it's complete.
23     recorder.save();
24     REPORTER_ASSERT(r, !pattern.match(&record, 0));
25 
26     recorder.clipRect(SkRect::MakeWH(300, 200));
27     REPORTER_ASSERT(r, !pattern.match(&record, 0));
28 
29     recorder.restore();
30     REPORTER_ASSERT(r, pattern.match(&record, 0));
31     REPORTER_ASSERT(r, pattern.first<Save>()      != NULL);
32     REPORTER_ASSERT(r, pattern.second<ClipRect>() != NULL);
33     REPORTER_ASSERT(r, pattern.third<Restore>()   != NULL);
34 }
35 
DEF_TEST(RecordPattern_StartingIndex,r)36 DEF_TEST(RecordPattern_StartingIndex, r) {
37     SaveClipRectRestore pattern;
38 
39     SkRecord record;
40     SkRecorder recorder(&record, 1920, 1200);
41 
42     // There will be two save-clipRect-restore blocks [0,3) and [3,6).
43     for (int i = 0; i < 2; i++) {
44         recorder.save();
45             recorder.clipRect(SkRect::MakeWH(300, 200));
46         recorder.restore();
47     }
48 
49     // We should match only at 0 and 3.  Going over the length should fail gracefully.
50     for (unsigned i = 0; i < 8; i++) {
51         if (i == 0 || i == 3) {
52             REPORTER_ASSERT(r, pattern.match(&record, i) == i + 3);
53         } else {
54             REPORTER_ASSERT(r, !pattern.match(&record, i));
55         }
56     }
57 }
58 
DEF_TEST(RecordPattern_DontMatchSubsequences,r)59 DEF_TEST(RecordPattern_DontMatchSubsequences, r) {
60     SaveClipRectRestore pattern;
61 
62     SkRecord record;
63     SkRecorder recorder(&record, 1920, 1200);
64 
65     recorder.save();
66         recorder.clipRect(SkRect::MakeWH(300, 200));
67         recorder.drawRect(SkRect::MakeWH(600, 300), SkPaint());
68     recorder.restore();
69 
70     REPORTER_ASSERT(r, !pattern.match(&record, 0));
71 }
72 
DEF_TEST(RecordPattern_Star,r)73 DEF_TEST(RecordPattern_Star, r) {
74     Pattern3<Is<Save>, Star<Is<ClipRect> >, Is<Restore> > pattern;
75 
76     SkRecord record;
77     SkRecorder recorder(&record, 1920, 1200);
78     int index = 0;
79 
80     recorder.save();
81         recorder.clipRect(SkRect::MakeWH(300, 200));
82     recorder.restore();
83     REPORTER_ASSERT(r, pattern.match(&record, index));
84     index += 3;
85 
86     recorder.save();
87         recorder.clipRect(SkRect::MakeWH(300, 200));
88         recorder.clipRect(SkRect::MakeWH(100, 100));
89     recorder.restore();
90     REPORTER_ASSERT(r, pattern.match(&record, index));
91 }
92 
DEF_TEST(RecordPattern_Complex,r)93 DEF_TEST(RecordPattern_Complex, r) {
94     Pattern3<Is<Save>,
95              Star<Not<Or3<Is<Save>,
96                           Is<Restore>,
97                           IsDraw> > >,
98              Is<Restore> > pattern;
99 
100     SkRecord record;
101     SkRecorder recorder(&record, 1920, 1200);
102     unsigned start, begin, end;
103 
104     start = record.count();
105     recorder.save();
106         recorder.clipRect(SkRect::MakeWH(300, 200));
107     recorder.restore();
108     REPORTER_ASSERT(r, pattern.match(&record, 0) == record.count());
109     end = start;
110     REPORTER_ASSERT(r, pattern.search(&record, &begin, &end));
111     REPORTER_ASSERT(r, begin == start);
112     REPORTER_ASSERT(r, end == record.count());
113 
114     start = record.count();
115     recorder.save();
116         recorder.clipRect(SkRect::MakeWH(300, 200));
117         recorder.drawRect(SkRect::MakeWH(100, 3000), SkPaint());
118     recorder.restore();
119     REPORTER_ASSERT(r, !pattern.match(&record, start));
120     end = start;
121     REPORTER_ASSERT(r, !pattern.search(&record, &begin, &end));
122 
123     start = record.count();
124     recorder.save();
125         recorder.clipRect(SkRect::MakeWH(300, 200));
126         recorder.clipRect(SkRect::MakeWH(100, 400));
127     recorder.restore();
128     REPORTER_ASSERT(r, pattern.match(&record, start) == record.count());
129     end = start;
130     REPORTER_ASSERT(r, pattern.search(&record, &begin, &end));
131     REPORTER_ASSERT(r, begin == start);
132     REPORTER_ASSERT(r, end == record.count());
133 
134     REPORTER_ASSERT(r, !pattern.search(&record, &begin, &end));
135 }
136 
DEF_TEST(RecordPattern_SaveLayerIsNotADraw,r)137 DEF_TEST(RecordPattern_SaveLayerIsNotADraw, r) {
138     Pattern1<IsDraw> pattern;
139 
140     SkRecord record;
141     SkRecorder recorder(&record, 1920, 1200);
142     recorder.saveLayer(NULL, NULL);
143 
144     REPORTER_ASSERT(r, !pattern.match(&record, 0));
145 }
146