From bcc52d27295ed6eebc1490032765cd98e21eaff6 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Fri, 31 Mar 2023 11:51:37 -0700 Subject: [PATCH 1/6] Adds the ability to specify a golden threadshold --- impeller/aiks/aiks_playground.cc | 3 ++- impeller/aiks/aiks_playground.h | 2 +- impeller/aiks/aiks_unittests.cc | 6 ++---- impeller/golden_tests/golden_digest.cc | 16 ++++++++++++---- impeller/golden_tests/golden_digest.h | 4 +++- impeller/golden_tests/golden_playground_test.h | 2 +- .../golden_tests/golden_playground_test_mac.cc | 11 +++++++---- .../golden_tests/golden_playground_test_stub.cc | 3 ++- impeller/golden_tests/golden_tests.cc | 10 ++++++---- .../bin/golden_tests_harvester.dart | 2 +- .../lib/golden_tests_harvester.dart | 4 +++- 11 files changed, 40 insertions(+), 23 deletions(-) diff --git a/impeller/aiks/aiks_playground.cc b/impeller/aiks/aiks_playground.cc index 5fc3124f283f8..50a4ac468e87c 100644 --- a/impeller/aiks/aiks_playground.cc +++ b/impeller/aiks/aiks_playground.cc @@ -14,7 +14,8 @@ AiksPlayground::AiksPlayground() = default; AiksPlayground::~AiksPlayground() = default; -bool AiksPlayground::OpenPlaygroundHere(const Picture& picture) { +bool AiksPlayground::OpenPlaygroundHere(const Picture& picture, + double threshold) { return OpenPlaygroundHere( [&picture](AiksContext& renderer, RenderTarget& render_target) -> bool { return renderer.Render(picture, render_target); diff --git a/impeller/aiks/aiks_playground.h b/impeller/aiks/aiks_playground.h index 02647faa7e3b1..ae25db3fb8756 100644 --- a/impeller/aiks/aiks_playground.h +++ b/impeller/aiks/aiks_playground.h @@ -20,7 +20,7 @@ class AiksPlayground : public PlaygroundTest { ~AiksPlayground(); - bool OpenPlaygroundHere(const Picture& picture); + bool OpenPlaygroundHere(const Picture& picture, double threshold = 0.01); bool OpenPlaygroundHere(AiksPlaygroundCallback callback); diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc index 6176c8ed97819..456cf7e8ea810 100644 --- a/impeller/aiks/aiks_unittests.cc +++ b/impeller/aiks/aiks_unittests.cc @@ -1317,9 +1317,6 @@ TEST_P(AiksTest, CanRenderTextOutsideBoundaries) { } TEST_P(AiksTest, TextRotated) { -#ifdef IMPELLER_GOLDEN_TESTS - GTEST_SKIP() << "Test has small differences on different mac hosts"; -#endif Canvas canvas; canvas.Transform(Matrix(0.5, -0.3, 0, -0.002, // 0, 1, 0, 0, // @@ -1330,7 +1327,8 @@ TEST_P(AiksTest, TextRotated) { GetContext(), canvas, "the quick brown fox jumped over the lazy dog!.?", "Roboto-Regular.ttf")); - ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); + ASSERT_TRUE( + OpenPlaygroundHere(canvas.EndRecordingAsPicture(), /*threshold=*/0.1)); } TEST_P(AiksTest, CanDrawPaint) { diff --git a/impeller/golden_tests/golden_digest.cc b/impeller/golden_tests/golden_digest.cc index 9181bfa6022ce..a5f6600158e39 100644 --- a/impeller/golden_tests/golden_digest.cc +++ b/impeller/golden_tests/golden_digest.cc @@ -23,8 +23,9 @@ GoldenDigest::GoldenDigest() {} void GoldenDigest::AddImage(const std::string& test_name, const std::string& filename, int32_t width, - int32_t height) { - entries_.push_back({test_name, filename, width, height}); + int32_t height, + double threshold) { + entries_.push_back({test_name, filename, width, height, threshold}); } bool GoldenDigest::Write(WorkingDirectory* working_directory) { @@ -46,8 +47,15 @@ bool GoldenDigest::Write(WorkingDirectory* working_directory) { << "\"testName\" : \"" << entry.test_name << "\", " << "\"filename\" : \"" << entry.filename << "\", " << "\"width\" : " << entry.width << ", " - << "\"height\" : " << entry.height << " " - << "}"; + << "\"height\" : " << entry.height << ", "; + + if (entry.threshold == static_cast(entry.threshold)) { + fout << "\"threshold\" : " << entry.threshold << ".0 "; + } else { + fout << "\"threshold\" : " << entry.threshold << " "; + } + + fout << "}"; } fout << std::endl << "]" << std::endl; diff --git a/impeller/golden_tests/golden_digest.h b/impeller/golden_tests/golden_digest.h index 011607ee599ae..5695262ddb73e 100644 --- a/impeller/golden_tests/golden_digest.h +++ b/impeller/golden_tests/golden_digest.h @@ -21,7 +21,8 @@ class GoldenDigest { void AddImage(const std::string& test_name, const std::string& filename, int32_t width, - int32_t height); + int32_t height, + double threshold); /// Writes a "digest.json" file to `working_directory`. /// @@ -36,6 +37,7 @@ class GoldenDigest { std::string filename; int32_t width; int32_t height; + double threshold; }; static GoldenDigest* instance_; diff --git a/impeller/golden_tests/golden_playground_test.h b/impeller/golden_tests/golden_playground_test.h index 4f0e5a025c2d6..c1f1a9f7d85ff 100644 --- a/impeller/golden_tests/golden_playground_test.h +++ b/impeller/golden_tests/golden_playground_test.h @@ -26,7 +26,7 @@ class GoldenPlaygroundTest PlaygroundBackend GetBackend() const; - bool OpenPlaygroundHere(const Picture& picture); + bool OpenPlaygroundHere(const Picture& picture, double threshold = 0.01); bool OpenPlaygroundHere(const AiksPlaygroundCallback& callback); diff --git a/impeller/golden_tests/golden_playground_test_mac.cc b/impeller/golden_tests/golden_playground_test_mac.cc index 49c31937266ea..53aff6ce42a3f 100644 --- a/impeller/golden_tests/golden_playground_test_mac.cc +++ b/impeller/golden_tests/golden_playground_test_mac.cc @@ -28,14 +28,16 @@ std::string GetGoldenFilename() { return GetTestName() + ".png"; } -bool SaveScreenshot(std::unique_ptr screenshot) { +bool SaveScreenshot(std::unique_ptr screenshot, + double threshold) { if (!screenshot || !screenshot->GetBytes()) { return false; } std::string test_name = GetTestName(); std::string filename = GetGoldenFilename(); testing::GoldenDigest::Instance()->AddImage( - test_name, filename, screenshot->GetWidth(), screenshot->GetHeight()); + test_name, filename, screenshot->GetWidth(), screenshot->GetHeight(), + threshold); return screenshot->WriteToPNG( testing::WorkingDirectory::Instance()->GetFilenamePath(filename)); } @@ -96,10 +98,11 @@ PlaygroundBackend GoldenPlaygroundTest::GetBackend() const { return GetParam(); } -bool GoldenPlaygroundTest::OpenPlaygroundHere(const Picture& picture) { +bool GoldenPlaygroundTest::OpenPlaygroundHere(const Picture& picture, + double threshold) { auto screenshot = pimpl_->screenshoter_->MakeScreenshot(picture, pimpl_->window_size_); - return SaveScreenshot(std::move(screenshot)); + return SaveScreenshot(std::move(screenshot), threshold); } bool GoldenPlaygroundTest::OpenPlaygroundHere( diff --git a/impeller/golden_tests/golden_playground_test_stub.cc b/impeller/golden_tests/golden_playground_test_stub.cc index 5114f13d89bc2..728bdfd24440f 100644 --- a/impeller/golden_tests/golden_playground_test_stub.cc +++ b/impeller/golden_tests/golden_playground_test_stub.cc @@ -16,7 +16,8 @@ PlaygroundBackend GoldenPlaygroundTest::GetBackend() const { return GetParam(); } -bool GoldenPlaygroundTest::OpenPlaygroundHere(const Picture& picture) { +bool GoldenPlaygroundTest::OpenPlaygroundHere(const Picture& picture, + double threshold) { return false; } diff --git a/impeller/golden_tests/golden_tests.cc b/impeller/golden_tests/golden_tests.cc index d3a33deb59830..b8a81fd37d454 100644 --- a/impeller/golden_tests/golden_tests.cc +++ b/impeller/golden_tests/golden_tests.cc @@ -32,14 +32,16 @@ std::string GetGoldenFilename() { return GetTestName() + ".png"; } -bool SaveScreenshot(std::unique_ptr screenshot) { +bool SaveScreenshot(std::unique_ptr screenshot, + double threshold) { if (!screenshot || !screenshot->GetBytes()) { return false; } std::string test_name = GetTestName(); std::string filename = GetGoldenFilename(); - GoldenDigest::Instance()->AddImage( - test_name, filename, screenshot->GetWidth(), screenshot->GetHeight()); + GoldenDigest::Instance()->AddImage(test_name, filename, + screenshot->GetWidth(), + screenshot->GetHeight(), threshold); return screenshot->WriteToPNG( WorkingDirectory::Instance()->GetFilenamePath(filename)); } @@ -73,7 +75,7 @@ TEST_F(GoldenTests, ConicalGradient) { canvas.DrawRect(Rect(10, 10, 250, 250), paint); Picture picture = canvas.EndRecordingAsPicture(); auto screenshot = Screenshoter().MakeScreenshot(picture); - ASSERT_TRUE(SaveScreenshot(std::move(screenshot))); + ASSERT_TRUE(SaveScreenshot(std::move(screenshot), 0.01)); } } // namespace testing } // namespace impeller diff --git a/impeller/golden_tests_harvester/bin/golden_tests_harvester.dart b/impeller/golden_tests_harvester/bin/golden_tests_harvester.dart index 7aa1f84d128be..e7d874a3e2ebb 100644 --- a/impeller/golden_tests_harvester/bin/golden_tests_harvester.dart +++ b/impeller/golden_tests_harvester/bin/golden_tests_harvester.dart @@ -23,7 +23,7 @@ class FakeSkiaGoldClient implements SkiaGoldClient { {double differentPixelsRate = 0.01, int pixelColorDelta = 0, required int screenshotSize}) async { - Logger.instance.log('addImg $testName ${goldenFile.path} $screenshotSize'); + Logger.instance.log('addImg testName:$testName goldenFile:${goldenFile.path} screenshotSize:$screenshotSize differentPixelsRate:$differentPixelsRate'); } @override diff --git a/impeller/golden_tests_harvester/lib/golden_tests_harvester.dart b/impeller/golden_tests_harvester/lib/golden_tests_harvester.dart index 85fb43b60cafe..cf7cd1e017539 100644 --- a/impeller/golden_tests_harvester/lib/golden_tests_harvester.dart +++ b/impeller/golden_tests_harvester/lib/golden_tests_harvester.dart @@ -32,9 +32,11 @@ Future harvest( final String filename = (map['filename'] as String?)!; final int width = (map['width'] as int?)!; final int height = (map['height'] as int?)!; + final double threshold = (map['threshold'] as double?)!; final File goldenImage = File(p.join(workDirectory.path, filename)); final Future future = skiaGoldClient - .addImg(filename, goldenImage, screenshotSize: width * height) + .addImg(filename, goldenImage, + screenshotSize: width * height, differentPixelsRate: threshold) .catchError((dynamic err) { Logger.instance.log('skia gold comparison failed: $err'); throw Exception('Failed comparison: $filename'); From 9dfc4ea24ee35bf5674abc1ba73191d517d962ee Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 3 Apr 2023 10:03:50 -0700 Subject: [PATCH 2/6] renamed threshold to max_diff_pixels_percent --- impeller/aiks/aiks_playground.cc | 2 +- impeller/aiks/aiks_playground.h | 3 ++- impeller/aiks/aiks_unittests.cc | 4 ++-- impeller/golden_tests/golden_digest.cc | 14 +++++++++----- impeller/golden_tests/golden_digest.h | 4 ++-- impeller/golden_tests/golden_playground_test.h | 3 ++- .../golden_tests/golden_playground_test_mac.cc | 8 ++++---- .../golden_tests/golden_playground_test_stub.cc | 2 +- impeller/golden_tests/golden_tests.cc | 8 ++++---- .../lib/golden_tests_harvester.dart | 2 +- 10 files changed, 28 insertions(+), 22 deletions(-) diff --git a/impeller/aiks/aiks_playground.cc b/impeller/aiks/aiks_playground.cc index 50a4ac468e87c..e35b139b604ef 100644 --- a/impeller/aiks/aiks_playground.cc +++ b/impeller/aiks/aiks_playground.cc @@ -15,7 +15,7 @@ AiksPlayground::AiksPlayground() = default; AiksPlayground::~AiksPlayground() = default; bool AiksPlayground::OpenPlaygroundHere(const Picture& picture, - double threshold) { + double max_diff_pixels_percent) { return OpenPlaygroundHere( [&picture](AiksContext& renderer, RenderTarget& render_target) -> bool { return renderer.Render(picture, render_target); diff --git a/impeller/aiks/aiks_playground.h b/impeller/aiks/aiks_playground.h index ae25db3fb8756..bf44823083e06 100644 --- a/impeller/aiks/aiks_playground.h +++ b/impeller/aiks/aiks_playground.h @@ -20,7 +20,8 @@ class AiksPlayground : public PlaygroundTest { ~AiksPlayground(); - bool OpenPlaygroundHere(const Picture& picture, double threshold = 0.01); + bool OpenPlaygroundHere(const Picture& picture, + double max_diff_pixels_percent = 0.01); bool OpenPlaygroundHere(AiksPlaygroundCallback callback); diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc index 456cf7e8ea810..29e17ffb4c270 100644 --- a/impeller/aiks/aiks_unittests.cc +++ b/impeller/aiks/aiks_unittests.cc @@ -1327,8 +1327,8 @@ TEST_P(AiksTest, TextRotated) { GetContext(), canvas, "the quick brown fox jumped over the lazy dog!.?", "Roboto-Regular.ttf")); - ASSERT_TRUE( - OpenPlaygroundHere(canvas.EndRecordingAsPicture(), /*threshold=*/0.1)); + ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture(), + /*max_diff_pixels_percent=*/0.01)); } TEST_P(AiksTest, CanDrawPaint) { diff --git a/impeller/golden_tests/golden_digest.cc b/impeller/golden_tests/golden_digest.cc index a5f6600158e39..edee81b2c5289 100644 --- a/impeller/golden_tests/golden_digest.cc +++ b/impeller/golden_tests/golden_digest.cc @@ -24,8 +24,9 @@ void GoldenDigest::AddImage(const std::string& test_name, const std::string& filename, int32_t width, int32_t height, - double threshold) { - entries_.push_back({test_name, filename, width, height, threshold}); + double max_diff_pixels_percent) { + entries_.push_back( + {test_name, filename, width, height, max_diff_pixels_percent}); } bool GoldenDigest::Write(WorkingDirectory* working_directory) { @@ -49,10 +50,13 @@ bool GoldenDigest::Write(WorkingDirectory* working_directory) { << "\"width\" : " << entry.width << ", " << "\"height\" : " << entry.height << ", "; - if (entry.threshold == static_cast(entry.threshold)) { - fout << "\"threshold\" : " << entry.threshold << ".0 "; + if (entry.max_diff_pixels_percent == + static_cast(entry.max_diff_pixels_percent)) { + fout << "\"maxDiffPixelsPercent\" : " << entry.max_diff_pixels_percent + << ".0 "; } else { - fout << "\"threshold\" : " << entry.threshold << " "; + fout << "\"maxDiffPixelsPercent\" : " << entry.max_diff_pixels_percent + << " "; } fout << "}"; diff --git a/impeller/golden_tests/golden_digest.h b/impeller/golden_tests/golden_digest.h index 5695262ddb73e..0689444dca714 100644 --- a/impeller/golden_tests/golden_digest.h +++ b/impeller/golden_tests/golden_digest.h @@ -22,7 +22,7 @@ class GoldenDigest { const std::string& filename, int32_t width, int32_t height, - double threshold); + double max_diff_pixels_percent); /// Writes a "digest.json" file to `working_directory`. /// @@ -37,7 +37,7 @@ class GoldenDigest { std::string filename; int32_t width; int32_t height; - double threshold; + double max_diff_pixels_percent; }; static GoldenDigest* instance_; diff --git a/impeller/golden_tests/golden_playground_test.h b/impeller/golden_tests/golden_playground_test.h index c1f1a9f7d85ff..69b70938edda3 100644 --- a/impeller/golden_tests/golden_playground_test.h +++ b/impeller/golden_tests/golden_playground_test.h @@ -26,7 +26,8 @@ class GoldenPlaygroundTest PlaygroundBackend GetBackend() const; - bool OpenPlaygroundHere(const Picture& picture, double threshold = 0.01); + bool OpenPlaygroundHere(const Picture& picture, + double max_diff_pixels_percent = 0.01); bool OpenPlaygroundHere(const AiksPlaygroundCallback& callback); diff --git a/impeller/golden_tests/golden_playground_test_mac.cc b/impeller/golden_tests/golden_playground_test_mac.cc index 53aff6ce42a3f..aeab9de7c0d65 100644 --- a/impeller/golden_tests/golden_playground_test_mac.cc +++ b/impeller/golden_tests/golden_playground_test_mac.cc @@ -29,7 +29,7 @@ std::string GetGoldenFilename() { } bool SaveScreenshot(std::unique_ptr screenshot, - double threshold) { + double max_diff_pixels_percent) { if (!screenshot || !screenshot->GetBytes()) { return false; } @@ -37,7 +37,7 @@ bool SaveScreenshot(std::unique_ptr screenshot, std::string filename = GetGoldenFilename(); testing::GoldenDigest::Instance()->AddImage( test_name, filename, screenshot->GetWidth(), screenshot->GetHeight(), - threshold); + max_diff_pixels_percent); return screenshot->WriteToPNG( testing::WorkingDirectory::Instance()->GetFilenamePath(filename)); } @@ -99,10 +99,10 @@ PlaygroundBackend GoldenPlaygroundTest::GetBackend() const { } bool GoldenPlaygroundTest::OpenPlaygroundHere(const Picture& picture, - double threshold) { + double max_diff_pixels_percent) { auto screenshot = pimpl_->screenshoter_->MakeScreenshot(picture, pimpl_->window_size_); - return SaveScreenshot(std::move(screenshot), threshold); + return SaveScreenshot(std::move(screenshot), max_diff_pixels_percent); } bool GoldenPlaygroundTest::OpenPlaygroundHere( diff --git a/impeller/golden_tests/golden_playground_test_stub.cc b/impeller/golden_tests/golden_playground_test_stub.cc index 728bdfd24440f..21be73ff934c1 100644 --- a/impeller/golden_tests/golden_playground_test_stub.cc +++ b/impeller/golden_tests/golden_playground_test_stub.cc @@ -17,7 +17,7 @@ PlaygroundBackend GoldenPlaygroundTest::GetBackend() const { } bool GoldenPlaygroundTest::OpenPlaygroundHere(const Picture& picture, - double threshold) { + double max_diff_pixels_percent) { return false; } diff --git a/impeller/golden_tests/golden_tests.cc b/impeller/golden_tests/golden_tests.cc index b8a81fd37d454..39eceaf7c3662 100644 --- a/impeller/golden_tests/golden_tests.cc +++ b/impeller/golden_tests/golden_tests.cc @@ -33,15 +33,15 @@ std::string GetGoldenFilename() { } bool SaveScreenshot(std::unique_ptr screenshot, - double threshold) { + double max_diff_pixels_percent) { if (!screenshot || !screenshot->GetBytes()) { return false; } std::string test_name = GetTestName(); std::string filename = GetGoldenFilename(); - GoldenDigest::Instance()->AddImage(test_name, filename, - screenshot->GetWidth(), - screenshot->GetHeight(), threshold); + GoldenDigest::Instance()->AddImage( + test_name, filename, screenshot->GetWidth(), screenshot->GetHeight(), + max_diff_pixels_percent); return screenshot->WriteToPNG( WorkingDirectory::Instance()->GetFilenamePath(filename)); } diff --git a/impeller/golden_tests_harvester/lib/golden_tests_harvester.dart b/impeller/golden_tests_harvester/lib/golden_tests_harvester.dart index cf7cd1e017539..e05b4c282f9e5 100644 --- a/impeller/golden_tests_harvester/lib/golden_tests_harvester.dart +++ b/impeller/golden_tests_harvester/lib/golden_tests_harvester.dart @@ -32,7 +32,7 @@ Future harvest( final String filename = (map['filename'] as String?)!; final int width = (map['width'] as int?)!; final int height = (map['height'] as int?)!; - final double threshold = (map['threshold'] as double?)!; + final double threshold = (map['maxDiffPixelsPercent'] as double?)!; final File goldenImage = File(p.join(workDirectory.path, filename)); final Future future = skiaGoldClient .addImg(filename, goldenImage, From 7a28698ff061c8dd9ca38415092ff8b9f174326c Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 3 Apr 2023 10:43:20 -0700 Subject: [PATCH 3/6] added the pixelColorDelta field --- impeller/aiks/aiks_playground.cc | 3 +-- impeller/aiks/aiks_playground.h | 6 ++++-- impeller/aiks/aiks_unittests.cc | 4 ++-- impeller/golden_tests/golden_digest.cc | 12 ++++++----- impeller/golden_tests/golden_digest.h | 4 +++- .../golden_tests/golden_playground_test.h | 6 ++++-- .../golden_playground_test_mac.cc | 21 ++++++++++++++----- .../golden_playground_test_stub.cc | 6 ++++-- impeller/golden_tests/golden_tests.cc | 7 ++++--- .../bin/golden_tests_harvester.dart | 2 +- .../lib/golden_tests_harvester.dart | 5 +++-- 11 files changed, 49 insertions(+), 27 deletions(-) diff --git a/impeller/aiks/aiks_playground.cc b/impeller/aiks/aiks_playground.cc index e35b139b604ef..5fc3124f283f8 100644 --- a/impeller/aiks/aiks_playground.cc +++ b/impeller/aiks/aiks_playground.cc @@ -14,8 +14,7 @@ AiksPlayground::AiksPlayground() = default; AiksPlayground::~AiksPlayground() = default; -bool AiksPlayground::OpenPlaygroundHere(const Picture& picture, - double max_diff_pixels_percent) { +bool AiksPlayground::OpenPlaygroundHere(const Picture& picture) { return OpenPlaygroundHere( [&picture](AiksContext& renderer, RenderTarget& render_target) -> bool { return renderer.Render(picture, render_target); diff --git a/impeller/aiks/aiks_playground.h b/impeller/aiks/aiks_playground.h index bf44823083e06..6bc91a245175e 100644 --- a/impeller/aiks/aiks_playground.h +++ b/impeller/aiks/aiks_playground.h @@ -20,11 +20,13 @@ class AiksPlayground : public PlaygroundTest { ~AiksPlayground(); - bool OpenPlaygroundHere(const Picture& picture, - double max_diff_pixels_percent = 0.01); + bool OpenPlaygroundHere(const Picture& picture); bool OpenPlaygroundHere(AiksPlaygroundCallback callback); + void SetGoldenThresholds(double max_diff_pixels_percent, + int32_t max_color_delta) {} + private: FML_DISALLOW_COPY_AND_ASSIGN(AiksPlayground); }; diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc index 29e17ffb4c270..dd93732b589c5 100644 --- a/impeller/aiks/aiks_unittests.cc +++ b/impeller/aiks/aiks_unittests.cc @@ -1317,6 +1317,7 @@ TEST_P(AiksTest, CanRenderTextOutsideBoundaries) { } TEST_P(AiksTest, TextRotated) { + SetGoldenThresholds(/*max_diff_pixels_percent=*/0.01, /*max_color_delta=*/40); Canvas canvas; canvas.Transform(Matrix(0.5, -0.3, 0, -0.002, // 0, 1, 0, 0, // @@ -1327,8 +1328,7 @@ TEST_P(AiksTest, TextRotated) { GetContext(), canvas, "the quick brown fox jumped over the lazy dog!.?", "Roboto-Regular.ttf")); - ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture(), - /*max_diff_pixels_percent=*/0.01)); + ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); } TEST_P(AiksTest, CanDrawPaint) { diff --git a/impeller/golden_tests/golden_digest.cc b/impeller/golden_tests/golden_digest.cc index edee81b2c5289..e2d8e608764ce 100644 --- a/impeller/golden_tests/golden_digest.cc +++ b/impeller/golden_tests/golden_digest.cc @@ -24,9 +24,10 @@ void GoldenDigest::AddImage(const std::string& test_name, const std::string& filename, int32_t width, int32_t height, - double max_diff_pixels_percent) { - entries_.push_back( - {test_name, filename, width, height, max_diff_pixels_percent}); + double max_diff_pixels_percent, + int32_t max_color_delta) { + entries_.push_back({test_name, filename, width, height, + max_diff_pixels_percent, max_color_delta}); } bool GoldenDigest::Write(WorkingDirectory* working_directory) { @@ -53,12 +54,13 @@ bool GoldenDigest::Write(WorkingDirectory* working_directory) { if (entry.max_diff_pixels_percent == static_cast(entry.max_diff_pixels_percent)) { fout << "\"maxDiffPixelsPercent\" : " << entry.max_diff_pixels_percent - << ".0 "; + << ".0, "; } else { fout << "\"maxDiffPixelsPercent\" : " << entry.max_diff_pixels_percent - << " "; + << ", "; } + fout << "\"maxColorDelta\":" << entry.max_color_delta << " "; fout << "}"; } fout << std::endl << "]" << std::endl; diff --git a/impeller/golden_tests/golden_digest.h b/impeller/golden_tests/golden_digest.h index 0689444dca714..14269d38bdb86 100644 --- a/impeller/golden_tests/golden_digest.h +++ b/impeller/golden_tests/golden_digest.h @@ -22,7 +22,8 @@ class GoldenDigest { const std::string& filename, int32_t width, int32_t height, - double max_diff_pixels_percent); + double max_diff_pixels_percent, + int32_t max_color_delta); /// Writes a "digest.json" file to `working_directory`. /// @@ -38,6 +39,7 @@ class GoldenDigest { int32_t width; int32_t height; double max_diff_pixels_percent; + int32_t max_color_delta; }; static GoldenDigest* instance_; diff --git a/impeller/golden_tests/golden_playground_test.h b/impeller/golden_tests/golden_playground_test.h index 69b70938edda3..49a5251dce21f 100644 --- a/impeller/golden_tests/golden_playground_test.h +++ b/impeller/golden_tests/golden_playground_test.h @@ -26,8 +26,7 @@ class GoldenPlaygroundTest PlaygroundBackend GetBackend() const; - bool OpenPlaygroundHere(const Picture& picture, - double max_diff_pixels_percent = 0.01); + bool OpenPlaygroundHere(const Picture& picture); bool OpenPlaygroundHere(const AiksPlaygroundCallback& callback); @@ -43,6 +42,9 @@ class GoldenPlaygroundTest ISize GetWindowSize() const; + void SetGoldenThresholds(double max_diff_pixels_percent, + int32_t max_color_delta); + private: struct GoldenPlaygroundTestImpl; // This is only a shared_ptr so it can work with a forward declared type. diff --git a/impeller/golden_tests/golden_playground_test_mac.cc b/impeller/golden_tests/golden_playground_test_mac.cc index aeab9de7c0d65..014625fe67811 100644 --- a/impeller/golden_tests/golden_playground_test_mac.cc +++ b/impeller/golden_tests/golden_playground_test_mac.cc @@ -29,7 +29,8 @@ std::string GetGoldenFilename() { } bool SaveScreenshot(std::unique_ptr screenshot, - double max_diff_pixels_percent) { + double max_diff_pixels_percent, + int32_t max_color_delta) { if (!screenshot || !screenshot->GetBytes()) { return false; } @@ -37,7 +38,7 @@ bool SaveScreenshot(std::unique_ptr screenshot, std::string filename = GetGoldenFilename(); testing::GoldenDigest::Instance()->AddImage( test_name, filename, screenshot->GetWidth(), screenshot->GetHeight(), - max_diff_pixels_percent); + max_diff_pixels_percent, max_color_delta); return screenshot->WriteToPNG( testing::WorkingDirectory::Instance()->GetFilenamePath(filename)); } @@ -48,6 +49,8 @@ struct GoldenPlaygroundTest::GoldenPlaygroundTestImpl { : screenshoter_(new testing::MetalScreenshoter()) {} std::unique_ptr screenshoter_; ISize window_size_ = ISize{1024, 768}; + double max_diff_pixels_percent = 0.01; + int32_t max_color_delta = 4; }; GoldenPlaygroundTest::GoldenPlaygroundTest() @@ -92,17 +95,19 @@ void GoldenPlaygroundTest::SetUp() { "GoldenPlaygroundTest doesn't support interactive playground tests " "yet."); } + + SetGoldenThresholds(/*max_diff_pixels_percent=*/0.01, /*max_color_delta=*/4); } PlaygroundBackend GoldenPlaygroundTest::GetBackend() const { return GetParam(); } -bool GoldenPlaygroundTest::OpenPlaygroundHere(const Picture& picture, - double max_diff_pixels_percent) { +bool GoldenPlaygroundTest::OpenPlaygroundHere(const Picture& picture) { auto screenshot = pimpl_->screenshoter_->MakeScreenshot(picture, pimpl_->window_size_); - return SaveScreenshot(std::move(screenshot), max_diff_pixels_percent); + return SaveScreenshot(std::move(screenshot), pimpl_->max_diff_pixels_percent, + pimpl_->max_color_delta); } bool GoldenPlaygroundTest::OpenPlaygroundHere( @@ -139,4 +144,10 @@ ISize GoldenPlaygroundTest::GetWindowSize() const { return pimpl_->window_size_; } +void GoldenPlaygroundTest::SetGoldenThresholds(double max_diff_pixels_percent, + int32_t max_color_delta) { + pimpl_->max_diff_pixels_percent = max_diff_pixels_percent; + pimpl_->max_color_delta = max_color_delta; +} + } // namespace impeller diff --git a/impeller/golden_tests/golden_playground_test_stub.cc b/impeller/golden_tests/golden_playground_test_stub.cc index 21be73ff934c1..6ffab243cfe86 100644 --- a/impeller/golden_tests/golden_playground_test_stub.cc +++ b/impeller/golden_tests/golden_playground_test_stub.cc @@ -16,8 +16,7 @@ PlaygroundBackend GoldenPlaygroundTest::GetBackend() const { return GetParam(); } -bool GoldenPlaygroundTest::OpenPlaygroundHere(const Picture& picture, - double max_diff_pixels_percent) { +bool GoldenPlaygroundTest::OpenPlaygroundHere(const Picture& picture) { return false; } @@ -48,4 +47,7 @@ ISize GoldenPlaygroundTest::GetWindowSize() const { return ISize(); } +void GoldenPlaygroundTest::SetGoldenThresholds(double max_diff_pixels_percent, + int32_t max_color_delta) {} + } // namespace impeller diff --git a/impeller/golden_tests/golden_tests.cc b/impeller/golden_tests/golden_tests.cc index 39eceaf7c3662..342377a236042 100644 --- a/impeller/golden_tests/golden_tests.cc +++ b/impeller/golden_tests/golden_tests.cc @@ -33,7 +33,8 @@ std::string GetGoldenFilename() { } bool SaveScreenshot(std::unique_ptr screenshot, - double max_diff_pixels_percent) { + double max_diff_pixels_percent, + int32_t max_color_delta) { if (!screenshot || !screenshot->GetBytes()) { return false; } @@ -41,7 +42,7 @@ bool SaveScreenshot(std::unique_ptr screenshot, std::string filename = GetGoldenFilename(); GoldenDigest::Instance()->AddImage( test_name, filename, screenshot->GetWidth(), screenshot->GetHeight(), - max_diff_pixels_percent); + max_diff_pixels_percent, max_color_delta); return screenshot->WriteToPNG( WorkingDirectory::Instance()->GetFilenamePath(filename)); } @@ -75,7 +76,7 @@ TEST_F(GoldenTests, ConicalGradient) { canvas.DrawRect(Rect(10, 10, 250, 250), paint); Picture picture = canvas.EndRecordingAsPicture(); auto screenshot = Screenshoter().MakeScreenshot(picture); - ASSERT_TRUE(SaveScreenshot(std::move(screenshot), 0.01)); + ASSERT_TRUE(SaveScreenshot(std::move(screenshot), 0.01, 4)); } } // namespace testing } // namespace impeller diff --git a/impeller/golden_tests_harvester/bin/golden_tests_harvester.dart b/impeller/golden_tests_harvester/bin/golden_tests_harvester.dart index e7d874a3e2ebb..8b5d2a2b55ba1 100644 --- a/impeller/golden_tests_harvester/bin/golden_tests_harvester.dart +++ b/impeller/golden_tests_harvester/bin/golden_tests_harvester.dart @@ -23,7 +23,7 @@ class FakeSkiaGoldClient implements SkiaGoldClient { {double differentPixelsRate = 0.01, int pixelColorDelta = 0, required int screenshotSize}) async { - Logger.instance.log('addImg testName:$testName goldenFile:${goldenFile.path} screenshotSize:$screenshotSize differentPixelsRate:$differentPixelsRate'); + Logger.instance.log('addImg testName:$testName goldenFile:${goldenFile.path} screenshotSize:$screenshotSize differentPixelsRate:$differentPixelsRate pixelColorDelta:$pixelColorDelta'); } @override diff --git a/impeller/golden_tests_harvester/lib/golden_tests_harvester.dart b/impeller/golden_tests_harvester/lib/golden_tests_harvester.dart index e05b4c282f9e5..144bd1562dbb7 100644 --- a/impeller/golden_tests_harvester/lib/golden_tests_harvester.dart +++ b/impeller/golden_tests_harvester/lib/golden_tests_harvester.dart @@ -32,11 +32,12 @@ Future harvest( final String filename = (map['filename'] as String?)!; final int width = (map['width'] as int?)!; final int height = (map['height'] as int?)!; - final double threshold = (map['maxDiffPixelsPercent'] as double?)!; + final double maxDiffPixelsPercent = (map['maxDiffPixelsPercent'] as double?)!; + final int maxColorDelta = (map['maxColorDelta'] as int?)!; final File goldenImage = File(p.join(workDirectory.path, filename)); final Future future = skiaGoldClient .addImg(filename, goldenImage, - screenshotSize: width * height, differentPixelsRate: threshold) + screenshotSize: width * height, differentPixelsRate: maxDiffPixelsPercent, pixelColorDelta: maxColorDelta) .catchError((dynamic err) { Logger.instance.log('skia gold comparison failed: $err'); throw Exception('Failed comparison: $filename'); From 9d5ee0befbf5a0318e9d494578b4062db6a693be Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 3 Apr 2023 10:51:43 -0700 Subject: [PATCH 4/6] updated skia_gold_docs --- .../skia_gold_client/lib/skia_gold_client.dart | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/testing/skia_gold_client/lib/skia_gold_client.dart b/testing/skia_gold_client/lib/skia_gold_client.dart index 793560e9021e3..b7d23abdb37c9 100644 --- a/testing/skia_gold_client/lib/skia_gold_client.dart +++ b/testing/skia_gold_client/lib/skia_gold_client.dart @@ -178,15 +178,21 @@ class SkiaGoldClient { /// The [testName] and [goldenFile] parameters reference the current /// comparison being evaluated. /// - /// [pixelColorDelta] defines maximum acceptable difference in RGB channels of each pixel, - /// such that: + /// [pixelColorDelta] defines maximum acceptable difference in RGB channels of + /// each pixel, such that: /// /// ``` - /// abs(r(image) - r(golden)) + abs(g(image) - g(golden)) + abs(b(image) - b(golden)) <= pixelDeltaThreshold + /// bool isSame(Color image, Color golden, int pixelDeltaThreshold) { + /// return abs(image.r - golden.r) + /// + abs(image.g - golden.g) + /// + abs(image.b - golden.b) <= pixelDeltaThreshold; + /// } /// ``` /// - /// [differentPixelsRate] is the fraction of accepted pixels to be wrong in the range [0.0, 1.0]. - /// Defaults to 0.01. A value of 0.01 means that 1% of the pixels are allowed to change. + /// [differentPixelsRate] is the fraction of pixels that can differ, as + /// determined by the [pixelColorDelta] parameter. It's in the range [0.0, + /// 1.0] and defaults to 0.01. A value of 0.01 means that 1% of the pixels are + /// allowed to be different. Future addImg( String testName, File goldenFile, { From 3f3be86a09b7bff94694664dd25c21b896338234 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 3 Apr 2023 13:48:15 -0700 Subject: [PATCH 5/6] made the golden fuzzy parameters test suite specific --- impeller/aiks/aiks_playground.h | 3 -- impeller/aiks/aiks_unittests.cc | 1 - .../golden_tests/golden_playground_test.h | 3 -- .../golden_playground_test_mac.cc | 27 ++++++---------- .../golden_playground_test_stub.cc | 3 -- impeller/golden_tests/golden_tests.cc | 32 +++++++++---------- 6 files changed, 25 insertions(+), 44 deletions(-) diff --git a/impeller/aiks/aiks_playground.h b/impeller/aiks/aiks_playground.h index 6bc91a245175e..02647faa7e3b1 100644 --- a/impeller/aiks/aiks_playground.h +++ b/impeller/aiks/aiks_playground.h @@ -24,9 +24,6 @@ class AiksPlayground : public PlaygroundTest { bool OpenPlaygroundHere(AiksPlaygroundCallback callback); - void SetGoldenThresholds(double max_diff_pixels_percent, - int32_t max_color_delta) {} - private: FML_DISALLOW_COPY_AND_ASSIGN(AiksPlayground); }; diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc index dd93732b589c5..760961c09899e 100644 --- a/impeller/aiks/aiks_unittests.cc +++ b/impeller/aiks/aiks_unittests.cc @@ -1317,7 +1317,6 @@ TEST_P(AiksTest, CanRenderTextOutsideBoundaries) { } TEST_P(AiksTest, TextRotated) { - SetGoldenThresholds(/*max_diff_pixels_percent=*/0.01, /*max_color_delta=*/40); Canvas canvas; canvas.Transform(Matrix(0.5, -0.3, 0, -0.002, // 0, 1, 0, 0, // diff --git a/impeller/golden_tests/golden_playground_test.h b/impeller/golden_tests/golden_playground_test.h index 49a5251dce21f..4f0e5a025c2d6 100644 --- a/impeller/golden_tests/golden_playground_test.h +++ b/impeller/golden_tests/golden_playground_test.h @@ -42,9 +42,6 @@ class GoldenPlaygroundTest ISize GetWindowSize() const; - void SetGoldenThresholds(double max_diff_pixels_percent, - int32_t max_color_delta); - private: struct GoldenPlaygroundTestImpl; // This is only a shared_ptr so it can work with a forward declared type. diff --git a/impeller/golden_tests/golden_playground_test_mac.cc b/impeller/golden_tests/golden_playground_test_mac.cc index 014625fe67811..118d8f5fca8de 100644 --- a/impeller/golden_tests/golden_playground_test_mac.cc +++ b/impeller/golden_tests/golden_playground_test_mac.cc @@ -45,12 +45,11 @@ bool SaveScreenshot(std::unique_ptr screenshot, } // namespace struct GoldenPlaygroundTest::GoldenPlaygroundTestImpl { - GoldenPlaygroundTestImpl() - : screenshoter_(new testing::MetalScreenshoter()) {} - std::unique_ptr screenshoter_; - ISize window_size_ = ISize{1024, 768}; - double max_diff_pixels_percent = 0.01; - int32_t max_color_delta = 4; + GoldenPlaygroundTestImpl() : screenshoter(new testing::MetalScreenshoter()) {} + std::unique_ptr screenshoter; + ISize window_size = ISize{1024, 768}; + const double max_diff_pixels_percent = 0.01; + const int32_t max_color_delta = 8; }; GoldenPlaygroundTest::GoldenPlaygroundTest() @@ -95,8 +94,6 @@ void GoldenPlaygroundTest::SetUp() { "GoldenPlaygroundTest doesn't support interactive playground tests " "yet."); } - - SetGoldenThresholds(/*max_diff_pixels_percent=*/0.01, /*max_color_delta=*/4); } PlaygroundBackend GoldenPlaygroundTest::GetBackend() const { @@ -105,7 +102,7 @@ PlaygroundBackend GoldenPlaygroundTest::GetBackend() const { bool GoldenPlaygroundTest::OpenPlaygroundHere(const Picture& picture) { auto screenshot = - pimpl_->screenshoter_->MakeScreenshot(picture, pimpl_->window_size_); + pimpl_->screenshoter->MakeScreenshot(picture, pimpl_->window_size); return SaveScreenshot(std::move(screenshot), pimpl_->max_diff_pixels_percent, pimpl_->max_color_delta); } @@ -129,11 +126,11 @@ std::shared_ptr GoldenPlaygroundTest::CreateTextureForFixture( } std::shared_ptr GoldenPlaygroundTest::GetContext() const { - return pimpl_->screenshoter_->GetContext().GetContext(); + return pimpl_->screenshoter->GetContext().GetContext(); } Point GoldenPlaygroundTest::GetContentScale() const { - return pimpl_->screenshoter_->GetPlayground().GetContentScale(); + return pimpl_->screenshoter->GetPlayground().GetContentScale(); } Scalar GoldenPlaygroundTest::GetSecondsElapsed() const { @@ -141,13 +138,7 @@ Scalar GoldenPlaygroundTest::GetSecondsElapsed() const { } ISize GoldenPlaygroundTest::GetWindowSize() const { - return pimpl_->window_size_; -} - -void GoldenPlaygroundTest::SetGoldenThresholds(double max_diff_pixels_percent, - int32_t max_color_delta) { - pimpl_->max_diff_pixels_percent = max_diff_pixels_percent; - pimpl_->max_color_delta = max_color_delta; + return pimpl_->window_size; } } // namespace impeller diff --git a/impeller/golden_tests/golden_playground_test_stub.cc b/impeller/golden_tests/golden_playground_test_stub.cc index 6ffab243cfe86..5114f13d89bc2 100644 --- a/impeller/golden_tests/golden_playground_test_stub.cc +++ b/impeller/golden_tests/golden_playground_test_stub.cc @@ -47,7 +47,4 @@ ISize GoldenPlaygroundTest::GetWindowSize() const { return ISize(); } -void GoldenPlaygroundTest::SetGoldenThresholds(double max_diff_pixels_percent, - int32_t max_color_delta) {} - } // namespace impeller diff --git a/impeller/golden_tests/golden_tests.cc b/impeller/golden_tests/golden_tests.cc index 342377a236042..e0d7c1ded5517 100644 --- a/impeller/golden_tests/golden_tests.cc +++ b/impeller/golden_tests/golden_tests.cc @@ -31,21 +31,6 @@ std::string GetTestName() { std::string GetGoldenFilename() { return GetTestName() + ".png"; } - -bool SaveScreenshot(std::unique_ptr screenshot, - double max_diff_pixels_percent, - int32_t max_color_delta) { - if (!screenshot || !screenshot->GetBytes()) { - return false; - } - std::string test_name = GetTestName(); - std::string filename = GetGoldenFilename(); - GoldenDigest::Instance()->AddImage( - test_name, filename, screenshot->GetWidth(), screenshot->GetHeight(), - max_diff_pixels_percent, max_color_delta); - return screenshot->WriteToPNG( - WorkingDirectory::Instance()->GetFilenamePath(filename)); -} } // namespace class GoldenTests : public ::testing::Test { @@ -54,8 +39,23 @@ class GoldenTests : public ::testing::Test { MetalScreenshoter& Screenshoter() { return *screenshoter_; } + bool SaveScreenshot(std::unique_ptr screenshot) { + if (!screenshot || !screenshot->GetBytes()) { + return false; + } + std::string test_name = GetTestName(); + std::string filename = GetGoldenFilename(); + GoldenDigest::Instance()->AddImage( + test_name, filename, screenshot->GetWidth(), screenshot->GetHeight(), + max_diff_pixels_percent_, max_color_delta_); + return screenshot->WriteToPNG( + WorkingDirectory::Instance()->GetFilenamePath(filename)); + } + private: std::unique_ptr screenshoter_; + const double max_diff_pixels_percent_ = 0.01; + const int32_t max_color_delta_ = 8; }; TEST_F(GoldenTests, ConicalGradient) { @@ -76,7 +76,7 @@ TEST_F(GoldenTests, ConicalGradient) { canvas.DrawRect(Rect(10, 10, 250, 250), paint); Picture picture = canvas.EndRecordingAsPicture(); auto screenshot = Screenshoter().MakeScreenshot(picture); - ASSERT_TRUE(SaveScreenshot(std::move(screenshot), 0.01, 4)); + ASSERT_TRUE(SaveScreenshot(std::move(screenshot))); } } // namespace testing } // namespace impeller From d0cf61dc22424dd12b9cec8817ba3efa3bdeb77f Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 3 Apr 2023 14:01:28 -0700 Subject: [PATCH 6/6] made the fuzzy paramters specific to the whole runner, not the test suite --- impeller/golden_tests/golden_digest.cc | 11 ++++---- impeller/golden_tests/golden_digest.h | 4 +-- .../golden_playground_test_mac.cc | 12 ++------ impeller/golden_tests/golden_tests.cc | 28 +++++++++---------- 4 files changed, 23 insertions(+), 32 deletions(-) diff --git a/impeller/golden_tests/golden_digest.cc b/impeller/golden_tests/golden_digest.cc index e2d8e608764ce..9dde1bdd9b14e 100644 --- a/impeller/golden_tests/golden_digest.cc +++ b/impeller/golden_tests/golden_digest.cc @@ -6,6 +6,9 @@ #include +static const double kMaxDiffPixelsPercent = 0.01; +static const int32_t kMaxColorDelta = 8; + namespace impeller { namespace testing { @@ -23,11 +26,9 @@ GoldenDigest::GoldenDigest() {} void GoldenDigest::AddImage(const std::string& test_name, const std::string& filename, int32_t width, - int32_t height, - double max_diff_pixels_percent, - int32_t max_color_delta) { - entries_.push_back({test_name, filename, width, height, - max_diff_pixels_percent, max_color_delta}); + int32_t height) { + entries_.push_back({test_name, filename, width, height, kMaxDiffPixelsPercent, + kMaxColorDelta}); } bool GoldenDigest::Write(WorkingDirectory* working_directory) { diff --git a/impeller/golden_tests/golden_digest.h b/impeller/golden_tests/golden_digest.h index 14269d38bdb86..a018ac1b9c7d8 100644 --- a/impeller/golden_tests/golden_digest.h +++ b/impeller/golden_tests/golden_digest.h @@ -21,9 +21,7 @@ class GoldenDigest { void AddImage(const std::string& test_name, const std::string& filename, int32_t width, - int32_t height, - double max_diff_pixels_percent, - int32_t max_color_delta); + int32_t height); /// Writes a "digest.json" file to `working_directory`. /// diff --git a/impeller/golden_tests/golden_playground_test_mac.cc b/impeller/golden_tests/golden_playground_test_mac.cc index 118d8f5fca8de..21d14066d9c6f 100644 --- a/impeller/golden_tests/golden_playground_test_mac.cc +++ b/impeller/golden_tests/golden_playground_test_mac.cc @@ -28,17 +28,14 @@ std::string GetGoldenFilename() { return GetTestName() + ".png"; } -bool SaveScreenshot(std::unique_ptr screenshot, - double max_diff_pixels_percent, - int32_t max_color_delta) { +bool SaveScreenshot(std::unique_ptr screenshot) { if (!screenshot || !screenshot->GetBytes()) { return false; } std::string test_name = GetTestName(); std::string filename = GetGoldenFilename(); testing::GoldenDigest::Instance()->AddImage( - test_name, filename, screenshot->GetWidth(), screenshot->GetHeight(), - max_diff_pixels_percent, max_color_delta); + test_name, filename, screenshot->GetWidth(), screenshot->GetHeight()); return screenshot->WriteToPNG( testing::WorkingDirectory::Instance()->GetFilenamePath(filename)); } @@ -48,8 +45,6 @@ struct GoldenPlaygroundTest::GoldenPlaygroundTestImpl { GoldenPlaygroundTestImpl() : screenshoter(new testing::MetalScreenshoter()) {} std::unique_ptr screenshoter; ISize window_size = ISize{1024, 768}; - const double max_diff_pixels_percent = 0.01; - const int32_t max_color_delta = 8; }; GoldenPlaygroundTest::GoldenPlaygroundTest() @@ -103,8 +98,7 @@ PlaygroundBackend GoldenPlaygroundTest::GetBackend() const { bool GoldenPlaygroundTest::OpenPlaygroundHere(const Picture& picture) { auto screenshot = pimpl_->screenshoter->MakeScreenshot(picture, pimpl_->window_size); - return SaveScreenshot(std::move(screenshot), pimpl_->max_diff_pixels_percent, - pimpl_->max_color_delta); + return SaveScreenshot(std::move(screenshot)); } bool GoldenPlaygroundTest::OpenPlaygroundHere( diff --git a/impeller/golden_tests/golden_tests.cc b/impeller/golden_tests/golden_tests.cc index e0d7c1ded5517..a54353fa0114a 100644 --- a/impeller/golden_tests/golden_tests.cc +++ b/impeller/golden_tests/golden_tests.cc @@ -31,6 +31,19 @@ std::string GetTestName() { std::string GetGoldenFilename() { return GetTestName() + ".png"; } + +bool SaveScreenshot(std::unique_ptr screenshot) { + if (!screenshot || !screenshot->GetBytes()) { + return false; + } + std::string test_name = GetTestName(); + std::string filename = GetGoldenFilename(); + GoldenDigest::Instance()->AddImage( + test_name, filename, screenshot->GetWidth(), screenshot->GetHeight()); + return screenshot->WriteToPNG( + WorkingDirectory::Instance()->GetFilenamePath(filename)); +} + } // namespace class GoldenTests : public ::testing::Test { @@ -39,23 +52,8 @@ class GoldenTests : public ::testing::Test { MetalScreenshoter& Screenshoter() { return *screenshoter_; } - bool SaveScreenshot(std::unique_ptr screenshot) { - if (!screenshot || !screenshot->GetBytes()) { - return false; - } - std::string test_name = GetTestName(); - std::string filename = GetGoldenFilename(); - GoldenDigest::Instance()->AddImage( - test_name, filename, screenshot->GetWidth(), screenshot->GetHeight(), - max_diff_pixels_percent_, max_color_delta_); - return screenshot->WriteToPNG( - WorkingDirectory::Instance()->GetFilenamePath(filename)); - } - private: std::unique_ptr screenshoter_; - const double max_diff_pixels_percent_ = 0.01; - const int32_t max_color_delta_ = 8; }; TEST_F(GoldenTests, ConicalGradient) {