1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef RecordTestUtils_DEFINED 9cb93a386Sopenharmony_ci#define RecordTestUtils_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "src/core/SkRecord.h" 12cb93a386Sopenharmony_ci#include "src/core/SkRecords.h" 13cb93a386Sopenharmony_ci#include "tests/Test.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci// If the command we're reading is a U, set ptr to it, otherwise set it to nullptr. 16cb93a386Sopenharmony_citemplate <typename U> 17cb93a386Sopenharmony_cistruct ReadAs { 18cb93a386Sopenharmony_ci ReadAs() : ptr(nullptr), type(SkRecords::Type(~0)) {} 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci const U* ptr; 21cb93a386Sopenharmony_ci SkRecords::Type type; 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci void operator()(const U& r) { ptr = &r; type = U::kType; } 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci template <typename T> 26cb93a386Sopenharmony_ci void operator()(const T&) { type = U::kType; } 27cb93a386Sopenharmony_ci}; 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci// Assert that the ith command in record is of type T, and return it. 30cb93a386Sopenharmony_citemplate <typename T> 31cb93a386Sopenharmony_cistatic const T* assert_type(skiatest::Reporter* r, const SkRecord& record, int index) { 32cb93a386Sopenharmony_ci ReadAs<T> reader; 33cb93a386Sopenharmony_ci record.visit(index, reader); 34cb93a386Sopenharmony_ci REPORTER_ASSERT(r, T::kType == reader.type); 35cb93a386Sopenharmony_ci REPORTER_ASSERT(r, SkToBool(reader.ptr)); 36cb93a386Sopenharmony_ci return reader.ptr; 37cb93a386Sopenharmony_ci} 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_citemplate <typename DrawT> struct MatchType { 40cb93a386Sopenharmony_ci template <typename T> int operator()(const T&) { return 0; } 41cb93a386Sopenharmony_ci int operator()(const DrawT&) { return 1; } 42cb93a386Sopenharmony_ci}; 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_citemplate <typename DrawT> int count_instances_of_type(const SkRecord& record) { 45cb93a386Sopenharmony_ci MatchType<DrawT> matcher; 46cb93a386Sopenharmony_ci int counter = 0; 47cb93a386Sopenharmony_ci for (int i = 0; i < record.count(); i++) { 48cb93a386Sopenharmony_ci counter += record.visit(i, matcher); 49cb93a386Sopenharmony_ci } 50cb93a386Sopenharmony_ci return counter; 51cb93a386Sopenharmony_ci} 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_citemplate <typename DrawT> int find_first_instances_of_type(const SkRecord& record) { 54cb93a386Sopenharmony_ci MatchType<DrawT> matcher; 55cb93a386Sopenharmony_ci for (int i = 0; i < record.count(); i++) { 56cb93a386Sopenharmony_ci if (record.visit(i, matcher)) { 57cb93a386Sopenharmony_ci return i; 58cb93a386Sopenharmony_ci } 59cb93a386Sopenharmony_ci } 60cb93a386Sopenharmony_ci return -1; 61cb93a386Sopenharmony_ci} 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci#endif//RecordTestUtils_DEFINED 64