| Index: gm/gm_expectations.cpp
|
| ===================================================================
|
| --- gm/gm_expectations.cpp (revision 9256)
|
| +++ gm/gm_expectations.cpp (working copy)
|
| @@ -18,12 +18,15 @@
|
| const static char kJsonKey_ActualResults_FailureIgnored[]= "failure-ignored";
|
| const static char kJsonKey_ActualResults_NoComparison[] = "no-comparison";
|
| const static char kJsonKey_ActualResults_Succeeded[] = "succeeded";
|
| -const static char kJsonKey_ActualResults_AnyStatus_BitmapHash[] = "bitmap-64bitMD5";
|
|
|
| const static char kJsonKey_ExpectedResults[] = "expected-results";
|
| -const static char kJsonKey_ExpectedResults_AllowedBitmapHashes[] = "allowed-bitmap-64bitMD5s";
|
| -const static char kJsonKey_ExpectedResults_IgnoreFailure[] = "ignore-failure";
|
| +const static char kJsonKey_ExpectedResults_AllowedDigests[] = "allowed-digests";
|
| +const static char kJsonKey_ExpectedResults_IgnoreFailure[] = "ignore-failure";
|
|
|
| +// Types of result hashes we support in the JSON file.
|
| +const static char kJsonKey_Hashtype_Bitmap_64bitMD5[] = "bitmap-64bitMD5";
|
| +
|
| +
|
| namespace skiagm {
|
|
|
| void gm_fprintf(FILE *stream, const char format[], ...) {
|
| @@ -43,15 +46,6 @@
|
| return result;
|
| }
|
|
|
| - // TODO(epoger): This currently assumes that the result SkHashDigest was
|
| - // generated as an SkHashDigest of an SkBitmap. We'll need to allow for other
|
| - // hash types to cover non-bitmaps.
|
| - Json::Value ActualResultAsJsonValue(const SkHashDigest& result) {
|
| - Json::Value jsonValue;
|
| - jsonValue[kJsonKey_ActualResults_AnyStatus_BitmapHash] = asJsonValue(result);
|
| - return jsonValue;
|
| - }
|
| -
|
| Json::Value CreateJsonTree(Json::Value expectedResults,
|
| Json::Value actualResultsFailed,
|
| Json::Value actualResultsFailureIgnored,
|
| @@ -69,6 +63,62 @@
|
| }
|
|
|
|
|
| + // GmResultDigest class...
|
| +
|
| + GmResultDigest::GmResultDigest(const SkBitmap &bitmap) {
|
| + fIsValid = SkBitmapHasher::ComputeDigest(bitmap, &fHashDigest);
|
| + }
|
| +
|
| + GmResultDigest::GmResultDigest(const Json::Value &jsonTypeValuePair) {
|
| + fIsValid = false;
|
| + if (!jsonTypeValuePair.isArray()) {
|
| + gm_fprintf(stderr, "found non-array json value when parsing GmResultDigest: %s\n",
|
| + jsonTypeValuePair.toStyledString().c_str());
|
| + DEBUGFAIL_SEE_STDERR;
|
| + } else if (2 != jsonTypeValuePair.size()) {
|
| + gm_fprintf(stderr, "found json array with wrong size when parsing GmResultDigest: %s\n",
|
| + jsonTypeValuePair.toStyledString().c_str());
|
| + DEBUGFAIL_SEE_STDERR;
|
| + } else {
|
| + // TODO(epoger): The current implementation assumes that the
|
| + // result digest is always of type kJsonKey_Hashtype_Bitmap_64bitMD5
|
| + Json::Value jsonHashValue = jsonTypeValuePair[1];
|
| + if (!jsonHashValue.isIntegral()) {
|
| + gm_fprintf(stderr,
|
| + "found non-integer jsonHashValue when parsing GmResultDigest: %s\n",
|
| + jsonTypeValuePair.toStyledString().c_str());
|
| + DEBUGFAIL_SEE_STDERR;
|
| + } else {
|
| + fHashDigest = jsonHashValue.asUInt64();
|
| + fIsValid = true;
|
| + }
|
| + }
|
| + }
|
| +
|
| + bool GmResultDigest::isValid() const {
|
| + return fIsValid;
|
| + }
|
| +
|
| + bool GmResultDigest::equals(const GmResultDigest &other) const {
|
| + // TODO(epoger): The current implementation assumes that this
|
| + // and other are always of type kJsonKey_Hashtype_Bitmap_64bitMD5
|
| + return (this->fIsValid && other.fIsValid && (this->fHashDigest == other.fHashDigest));
|
| + }
|
| +
|
| + Json::Value GmResultDigest::asJsonTypeValuePair() const {
|
| + // TODO(epoger): The current implementation assumes that the
|
| + // result digest is always of type kJsonKey_Hashtype_Bitmap_64bitMD5
|
| + Json::Value jsonTypeValuePair;
|
| + if (fIsValid) {
|
| + jsonTypeValuePair.append(Json::Value(kJsonKey_Hashtype_Bitmap_64bitMD5));
|
| + jsonTypeValuePair.append(Json::UInt64(fHashDigest));
|
| + } else {
|
| + jsonTypeValuePair.append(Json::Value("INVALID"));
|
| + }
|
| + return jsonTypeValuePair;
|
| + }
|
| +
|
| +
|
| // Expectations class...
|
|
|
| Expectations::Expectations(bool ignoreFailure) {
|
| @@ -78,13 +128,7 @@
|
| Expectations::Expectations(const SkBitmap& bitmap, bool ignoreFailure) {
|
| fBitmap = bitmap;
|
| fIgnoreFailure = ignoreFailure;
|
| - SkHashDigest digest;
|
| - // TODO(epoger): Better handling for error returned by ComputeDigest()?
|
| - // For now, we just report a digest of 0 in error cases, like before.
|
| - if (!SkBitmapHasher::ComputeDigest(bitmap, &digest)) {
|
| - digest = 0;
|
| - }
|
| - fAllowedBitmapChecksums.push_back() = digest;
|
| + fAllowedResultDigests.push_back(GmResultDigest(bitmap));
|
| }
|
|
|
| Expectations::Expectations(Json::Value jsonElement) {
|
| @@ -105,36 +149,27 @@
|
| fIgnoreFailure = ignoreFailure.asBool();
|
| }
|
|
|
| - Json::Value allowedChecksums =
|
| - jsonElement[kJsonKey_ExpectedResults_AllowedBitmapHashes];
|
| - if (allowedChecksums.isNull()) {
|
| - // ok, we'll just assume there aren't any expected checksums to compare against
|
| - } else if (!allowedChecksums.isArray()) {
|
| + Json::Value allowedDigests = jsonElement[kJsonKey_ExpectedResults_AllowedDigests];
|
| + if (allowedDigests.isNull()) {
|
| + // ok, we'll just assume there aren't any AllowedDigests to compare against
|
| + } else if (!allowedDigests.isArray()) {
|
| gm_fprintf(stderr, "found non-array json value"
|
| " for key '%s' in element '%s'\n",
|
| - kJsonKey_ExpectedResults_AllowedBitmapHashes,
|
| + kJsonKey_ExpectedResults_AllowedDigests,
|
| jsonElement.toStyledString().c_str());
|
| DEBUGFAIL_SEE_STDERR;
|
| } else {
|
| - for (Json::ArrayIndex i=0; i<allowedChecksums.size(); i++) {
|
| - Json::Value checksumElement = allowedChecksums[i];
|
| - if (!checksumElement.isIntegral()) {
|
| - gm_fprintf(stderr, "found non-integer checksum"
|
| - " in json element '%s'\n",
|
| - jsonElement.toStyledString().c_str());
|
| - DEBUGFAIL_SEE_STDERR;
|
| - } else {
|
| - fAllowedBitmapChecksums.push_back() = asChecksum(checksumElement);
|
| - }
|
| + for (Json::ArrayIndex i=0; i<allowedDigests.size(); i++) {
|
| + fAllowedResultDigests.push_back(GmResultDigest(allowedDigests[i]));
|
| }
|
| }
|
| }
|
| }
|
|
|
| - bool Expectations::match(Checksum actualChecksum) const {
|
| - for (int i=0; i < this->fAllowedBitmapChecksums.count(); i++) {
|
| - Checksum allowedChecksum = this->fAllowedBitmapChecksums[i];
|
| - if (allowedChecksum == actualChecksum) {
|
| + bool Expectations::match(GmResultDigest actualGmResultDigest) const {
|
| + for (int i=0; i < this->fAllowedResultDigests.count(); i++) {
|
| + GmResultDigest allowedResultDigest = this->fAllowedResultDigests[i];
|
| + if (allowedResultDigest.equals(actualGmResultDigest)) {
|
| return true;
|
| }
|
| }
|
| @@ -142,18 +177,17 @@
|
| }
|
|
|
| Json::Value Expectations::asJsonValue() const {
|
| - Json::Value allowedChecksumArray;
|
| - if (!this->fAllowedBitmapChecksums.empty()) {
|
| - for (int i=0; i < this->fAllowedBitmapChecksums.count(); i++) {
|
| - Checksum allowedChecksum = this->fAllowedBitmapChecksums[i];
|
| - allowedChecksumArray.append(Json::UInt64(allowedChecksum));
|
| + Json::Value allowedDigestArray;
|
| + if (!this->fAllowedResultDigests.empty()) {
|
| + for (int i=0; i < this->fAllowedResultDigests.count(); i++) {
|
| + allowedDigestArray.append(this->fAllowedResultDigests[i].asJsonTypeValuePair());
|
| }
|
| }
|
|
|
| - Json::Value jsonValue;
|
| - jsonValue[kJsonKey_ExpectedResults_AllowedBitmapHashes] = allowedChecksumArray;
|
| - jsonValue[kJsonKey_ExpectedResults_IgnoreFailure] = this->ignoreFailure();
|
| - return jsonValue;
|
| + Json::Value jsonExpectations;
|
| + jsonExpectations[kJsonKey_ExpectedResults_AllowedDigests] = allowedDigestArray;
|
| + jsonExpectations[kJsonKey_ExpectedResults_IgnoreFailure] = this->ignoreFailure();
|
| + return jsonExpectations;
|
| }
|
|
|
|
|
|
|