1#ifndef YAZE_APP_TEST_SCREENSHOT_ASSERTION_H
2#define YAZE_APP_TEST_SCREENSHOT_ASSERTION_H
10#include "absl/status/status.h"
11#include "absl/status/statusor.h"
90 return static_cast<size_t>((y *
width + x) * 4);
142 const std::string& reference_path);
154 const std::string& reference_path,
const ScreenRegion& region);
160 const std::string& baseline_name);
166 const std::string& baseline_name);
183 absl::StatusOr<Screenshot>
LoadReference(
const std::string& path);
188 absl::StatusOr<Screenshot>
GetBaseline(
const std::string& name)
const;
215 const std::string& output_path);
229 uint8_t b,
int tolerance = 10);
235 const ScreenRegion& region, uint8_t r, uint8_t g, uint8_t b,
236 float min_coverage = 0.1f);
242 uint8_t r, uint8_t g,
243 uint8_t b,
int tolerance = 10);
256 const std::string& path);
261 static absl::StatusOr<Screenshot>
LoadScreenshot(
const std::string& path);
278 bool ColorsMatch(uint8_t r1, uint8_t g1, uint8_t b1, uint8_t r2, uint8_t g2,
279 uint8_t b2,
int threshold)
const;
295#define YAZE_ASSERT_SCREENSHOT_MATCHES(assertion, reference_path) \
297 auto result = (assertion).AssertMatchesReference(reference_path); \
298 ASSERT_TRUE(result.ok()) << result.status().message(); \
299 EXPECT_TRUE(result->passed) \
300 << "Screenshot mismatch: " << result->difference_percentage \
301 << "% different, expected <" \
302 << (1.0f - (assertion).GetConfig().tolerance) * 100 \
303 << "%\nDiff image: " << result->diff_image_path; \
309#define YAZE_ASSERT_SCREENSHOT_CHANGED(assertion, baseline_name) \
311 auto result = (assertion).AssertChanged(baseline_name); \
312 ASSERT_TRUE(result.ok()) << result.status().message(); \
313 EXPECT_TRUE(result->passed) \
314 << "Expected screenshot to change but similarity was " \
315 << result->similarity * 100 << "%"; \
321#define YAZE_ASSERT_SCREENSHOT_UNCHANGED(assertion, baseline_name) \
323 auto result = (assertion).AssertUnchanged(baseline_name); \
324 ASSERT_TRUE(result.ok()) << result.status().message(); \
325 EXPECT_TRUE(result->passed) \
326 << "Expected screenshot unchanged but " \
327 << result->difference_percentage << "% different\n" \
328 << "Diff image: " << result->diff_image_path; \
Utilities for screenshot-based testing assertions.
absl::StatusOr< ComparisonResult > AssertMatchesReference(const std::string &reference_path)
Assert current screen matches a reference image file.
absl::StatusOr< ComparisonResult > AssertUnchanged(const std::string &baseline_name)
Assert screen has NOT changed since baseline.
static absl::Status SaveScreenshot(const Screenshot &screenshot, const std::string &path)
Save screenshot to file (PNG format).
absl::StatusOr< Screenshot > CaptureScreen()
Capture current screen and return it.
ComparisonResult CompareStructural(const Screenshot &actual, const Screenshot &expected)
std::function< absl::StatusOr< Screenshot >()> CaptureCallback
absl::StatusOr< bool > AssertRegionExcludesColor(const ScreenRegion ®ion, uint8_t r, uint8_t g, uint8_t b, int tolerance=10)
Assert region does NOT contain a specific color.
absl::StatusOr< Screenshot > LoadReference(const std::string &path)
Load a reference image from file.
void ClearBaselines()
Clear all captured baselines.
void SetConfig(const ComparisonConfig &config)
~ScreenshotAssertion()=default
absl::StatusOr< bool > AssertPixelColor(int x, int y, uint8_t r, uint8_t g, uint8_t b, int tolerance=10)
Assert pixel at (x, y) has expected color.
absl::StatusOr< std::string > GenerateDiffImage(const Screenshot &actual, const Screenshot &expected, const std::string &output_path)
Generate a visual diff image.
CaptureCallback capture_callback_
absl::StatusOr< ComparisonResult > AssertRegionMatches(const std::string &reference_path, const ScreenRegion ®ion)
Assert a specific region matches reference.
std::unordered_map< std::string, Screenshot > baselines_
ComparisonResult ComparePixelExact(const Screenshot &actual, const Screenshot &expected, const ScreenRegion ®ion)
absl::Status CaptureBaseline(const std::string &name)
Capture and store a baseline screenshot.
static absl::StatusOr< Screenshot > LoadScreenshot(const std::string &path)
Load screenshot from file.
bool ColorsMatch(uint8_t r1, uint8_t g1, uint8_t b1, uint8_t r2, uint8_t g2, uint8_t b2, int threshold) const
absl::Status SaveAsReference(const std::string &path)
Save current screen as a new reference image.
ComparisonResult Compare(const Screenshot &actual, const Screenshot &expected)
Compare two screenshots.
absl::StatusOr< Screenshot > GetBaseline(const std::string &name) const
Get a previously captured baseline.
absl::StatusOr< ComparisonResult > AssertChanged(const std::string &baseline_name)
Assert screen has changed since baseline.
ComparisonResult ComparePerceptualHash(const Screenshot &actual, const Screenshot &expected)
std::vector< ScreenRegion > FindDifferingRegions(const Screenshot &actual, const Screenshot &expected, int threshold)
absl::StatusOr< bool > AssertRegionContainsColor(const ScreenRegion ®ion, uint8_t r, uint8_t g, uint8_t b, float min_coverage=0.1f)
Assert region contains a specific color.
void SetCaptureCallback(CaptureCallback callback)
ComparisonResult CompareRegion(const Screenshot &actual, const Screenshot &expected, const ScreenRegion ®ion)
Compare specific regions of two screenshots.
absl::StatusOr< ComparisonResult > AssertMatchesScreenshot(const Screenshot &expected)
Assert current screen matches another Screenshot object.
const ComparisonConfig & GetConfig() const
Configuration for screenshot comparison.
std::string diff_output_dir
std::vector< ScreenRegion > ignore_regions
Result of a screenshot comparison.
float difference_percentage
std::vector< ScreenRegion > differing_regions
std::chrono::milliseconds comparison_time
std::string diff_image_path
std::string error_message
Region of interest for screenshot comparison.
bool IsFullScreen() const
static ScreenRegion At(int x, int y, int w, int h)
static ScreenRegion FullScreen()
Screenshot data container.
std::vector< uint8_t > data
size_t GetPixelIndex(int x, int y) const