feat(cpp/tests): test_visual con png diff vs goldens (skip si vacio)
- png_diff.{h,cpp}: pixel_diff_ratio(path_a, path_b, channel_threshold) con
stb_image. Devuelve PngDiffResult con pixels_total, pixels_different y
diff_ratio. Si dimensiones difieren, diff_ratio=1.0.
- test_visual.cpp: invoca primitives_gallery --capture sobre tmpdir, compara
cada PNG vs cpp/tests/golden/<demo>.png con tolerancia 1% pixels distintos
(threshold 5/255 por canal). SKIPea con WARN si:
* golden dir vacio (no hay goldens todavia)
* binario primitives_gallery no construido
* el binario falla al capturar (entorno sin GL)
- CMakeLists: registra test_visual con FN_TEST_GOLDEN_DIR, FN_TEST_GALLERY_BIN,
FN_TEST_TMP_DIR y FN_TEST_REPO_ROOT (para que la captura corra desde la
raiz del repo y resuelva paths relativos como sql_workbench's registry.db).
- golden/: 41 PNGs iniciales generados en este entorno (WSL +
LIBGL_ALWAYS_SOFTWARE=1). Pueden regenerarse con cpp/scripts/update_goldens.sh.
Issue 0048.
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
#pragma once
|
||||
// Helper minimo para comparar dos imagenes PNG con tolerancia.
|
||||
// Usa stb_image (vendored en cpp/vendor/stb).
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace fn_test {
|
||||
|
||||
struct PngDiffResult {
|
||||
bool loaded_a = false;
|
||||
bool loaded_b = false;
|
||||
int width_a = 0, height_a = 0;
|
||||
int width_b = 0, height_b = 0;
|
||||
long pixels_total = 0;
|
||||
long pixels_different = 0;
|
||||
double diff_ratio = 0.0; // pixels_different / pixels_total
|
||||
};
|
||||
|
||||
// Carga ambos PNG, compara pixel a pixel con `channel_threshold` (0..255) por
|
||||
// canal RGBA. Si la diferencia de cualquier canal supera el umbral, el pixel
|
||||
// se marca como distinto. `diff_ratio` = pixels distintos / total.
|
||||
//
|
||||
// Si las dimensiones no coinciden devuelve loaded_*=true pero diff_ratio=1.0
|
||||
// y pixels_total = max(area_a, area_b).
|
||||
PngDiffResult pixel_diff_ratio(const std::string& path_a,
|
||||
const std::string& path_b,
|
||||
int channel_threshold = 5);
|
||||
|
||||
} // namespace fn_test
|
||||
Reference in New Issue
Block a user