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);
132 std::function<absl::StatusOr<Screenshot>()>;
143 const std::string& reference_path);
155 const std::string& reference_path,
162 const std::string& baseline_name);
168 const std::string& baseline_name);
185 absl::StatusOr<Screenshot>
LoadReference(
const std::string& path);
190 absl::StatusOr<Screenshot>
GetBaseline(
const std::string& name)
const;
218 const std::string& output_path);
232 int x,
int y, uint8_t r, uint8_t g, uint8_t b,
int tolerance = 10);
239 uint8_t r, uint8_t g, uint8_t b,
240 float min_coverage = 0.1f);
247 uint8_t r, uint8_t g, uint8_t b,
261 const std::string& path);
266 static absl::StatusOr<Screenshot>
LoadScreenshot(
const std::string& path);
283 bool ColorsMatch(uint8_t r1, uint8_t g1, uint8_t b1,
284 uint8_t r2, uint8_t g2, uint8_t b2,
285 int threshold)
const;
302#define YAZE_ASSERT_SCREENSHOT_MATCHES(assertion, reference_path) \
304 auto result = (assertion).AssertMatchesReference(reference_path); \
305 ASSERT_TRUE(result.ok()) << result.status().message(); \
306 EXPECT_TRUE(result->passed) \
307 << "Screenshot mismatch: " << result->difference_percentage \
308 << "% different, expected <" << (1.0f - (assertion).GetConfig().tolerance) * 100 \
309 << "%\nDiff image: " << result->diff_image_path; \
315#define YAZE_ASSERT_SCREENSHOT_CHANGED(assertion, baseline_name) \
317 auto result = (assertion).AssertChanged(baseline_name); \
318 ASSERT_TRUE(result.ok()) << result.status().message(); \
319 EXPECT_TRUE(result->passed) \
320 << "Expected screenshot to change but similarity was " \
321 << result->similarity * 100 << "%"; \
327#define YAZE_ASSERT_SCREENSHOT_UNCHANGED(assertion, baseline_name) \
329 auto result = (assertion).AssertUnchanged(baseline_name); \
330 ASSERT_TRUE(result.ok()) << result.status().message(); \
331 EXPECT_TRUE(result->passed) \
332 << "Expected screenshot unchanged but " \
333 << result->difference_percentage << "% different\n" \
334 << "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)
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_
std::function< absl::StatusOr< Screenshot >()> CaptureCallback
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