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