RecordPatternTest.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. #include "tests/Test.h"
  8. #include "src/core/SkRecord.h"
  9. #include "src/core/SkRecordPattern.h"
  10. #include "src/core/SkRecorder.h"
  11. #include "src/core/SkRecords.h"
  12. using namespace SkRecords;
  13. typedef Pattern<Is<Save>,
  14. Is<ClipRect>,
  15. Is<Restore>>
  16. SaveClipRectRestore;
  17. DEF_TEST(RecordPattern_Simple, r) {
  18. SaveClipRectRestore pattern;
  19. SkRecord record;
  20. REPORTER_ASSERT(r, !pattern.match(&record, 0));
  21. SkRecorder recorder(&record, 1920, 1200);
  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. recorder.clipRect(SkRect::MakeWH(300, 200));
  26. REPORTER_ASSERT(r, !pattern.match(&record, 0));
  27. recorder.restore();
  28. REPORTER_ASSERT(r, pattern.match(&record, 0));
  29. REPORTER_ASSERT(r, pattern.first<Save>() != nullptr);
  30. REPORTER_ASSERT(r, pattern.second<ClipRect>() != nullptr);
  31. REPORTER_ASSERT(r, pattern.third<Restore>() != nullptr);
  32. }
  33. DEF_TEST(RecordPattern_StartingIndex, r) {
  34. SaveClipRectRestore pattern;
  35. SkRecord record;
  36. SkRecorder recorder(&record, 1920, 1200);
  37. // There will be two save-clipRect-restore blocks [0,3) and [3,6).
  38. for (int i = 0; i < 2; i++) {
  39. recorder.save();
  40. recorder.clipRect(SkRect::MakeWH(300, 200));
  41. recorder.restore();
  42. }
  43. // We should match only at 0 and 3. Going over the length should fail gracefully.
  44. for (int i = 0; i < 8; i++) {
  45. if (i == 0 || i == 3) {
  46. REPORTER_ASSERT(r, pattern.match(&record, i) == i + 3);
  47. } else {
  48. REPORTER_ASSERT(r, !pattern.match(&record, i));
  49. }
  50. }
  51. }
  52. DEF_TEST(RecordPattern_DontMatchSubsequences, r) {
  53. SaveClipRectRestore pattern;
  54. SkRecord record;
  55. SkRecorder recorder(&record, 1920, 1200);
  56. recorder.save();
  57. recorder.clipRect(SkRect::MakeWH(300, 200));
  58. recorder.drawRect(SkRect::MakeWH(600, 300), SkPaint());
  59. recorder.restore();
  60. REPORTER_ASSERT(r, !pattern.match(&record, 0));
  61. }
  62. DEF_TEST(RecordPattern_Greedy, r) {
  63. Pattern<Is<Save>, Greedy<Is<ClipRect>>, Is<Restore>> pattern;
  64. SkRecord record;
  65. SkRecorder recorder(&record, 1920, 1200);
  66. int index = 0;
  67. recorder.save();
  68. recorder.clipRect(SkRect::MakeWH(300, 200));
  69. recorder.restore();
  70. REPORTER_ASSERT(r, pattern.match(&record, index));
  71. index += 3;
  72. recorder.save();
  73. recorder.clipRect(SkRect::MakeWH(300, 200));
  74. recorder.clipRect(SkRect::MakeWH(100, 100));
  75. recorder.restore();
  76. REPORTER_ASSERT(r, pattern.match(&record, index));
  77. }
  78. DEF_TEST(RecordPattern_Complex, r) {
  79. Pattern<Is<Save>,
  80. Greedy<Not<Or<Is<Save>,
  81. Is<Restore>,
  82. IsDraw>>>,
  83. Is<Restore>> pattern;
  84. SkRecord record;
  85. SkRecorder recorder(&record, 1920, 1200);
  86. int start, begin, end;
  87. start = record.count();
  88. recorder.save();
  89. recorder.clipRect(SkRect::MakeWH(300, 200));
  90. recorder.restore();
  91. REPORTER_ASSERT(r, pattern.match(&record, 0) == record.count());
  92. end = start;
  93. REPORTER_ASSERT(r, pattern.search(&record, &begin, &end));
  94. REPORTER_ASSERT(r, begin == start);
  95. REPORTER_ASSERT(r, end == record.count());
  96. start = record.count();
  97. recorder.save();
  98. recorder.clipRect(SkRect::MakeWH(300, 200));
  99. recorder.drawRect(SkRect::MakeWH(100, 3000), SkPaint());
  100. recorder.restore();
  101. REPORTER_ASSERT(r, !pattern.match(&record, start));
  102. end = start;
  103. REPORTER_ASSERT(r, !pattern.search(&record, &begin, &end));
  104. start = record.count();
  105. recorder.save();
  106. recorder.clipRect(SkRect::MakeWH(300, 200));
  107. recorder.clipRect(SkRect::MakeWH(100, 400));
  108. recorder.restore();
  109. REPORTER_ASSERT(r, pattern.match(&record, start) == record.count());
  110. end = start;
  111. REPORTER_ASSERT(r, pattern.search(&record, &begin, &end));
  112. REPORTER_ASSERT(r, begin == start);
  113. REPORTER_ASSERT(r, end == record.count());
  114. REPORTER_ASSERT(r, !pattern.search(&record, &begin, &end));
  115. }
  116. DEF_TEST(RecordPattern_SaveLayerIsNotADraw, r) {
  117. Pattern<IsDraw> pattern;
  118. SkRecord record;
  119. SkRecorder recorder(&record, 1920, 1200);
  120. recorder.saveLayer(nullptr, nullptr);
  121. REPORTER_ASSERT(r, !pattern.match(&record, 0));
  122. }