use egui::Vec2;
use egui_kittest::{HarnessBuilder, OsThreshold, SnapshotOptions};
#[derive(Clone, Copy, Debug)]
pub enum TestOptions {
Gui,
Rendering3D,
}
pub fn new_harness<T>(option: TestOptions, size: impl Into<Vec2>) -> HarnessBuilder<T> {
re_log::setup_logging();
let size = size.into();
let options = match option {
TestOptions::Gui => default_snapshot_options_for_ui(),
TestOptions::Rendering3D => default_snapshot_options_for_3d(size),
};
egui_kittest::Harness::builder()
.wgpu()
.with_size(size)
.with_options(options)
}
pub fn is_ci() -> bool {
static IS_CI: std::sync::LazyLock<bool> =
std::sync::LazyLock::new(|| std::env::var("CI").is_ok());
*IS_CI
}
pub fn strict_on_ci<T: Copy>(strict: T, lenient: impl Into<OsThreshold<T>>) -> OsThreshold<T> {
let lenient = lenient.into();
if is_ci() {
lenient.linux(strict)
} else {
lenient
}
}
pub fn default_snapshot_options_for_ui() -> SnapshotOptions {
#[expect(clippy::disallowed_methods)]
SnapshotOptions::new().threshold(1.0).max_failed_pixels(10)
}
pub fn default_snapshot_options_for_3d(viewport_size: Vec2) -> SnapshotOptions {
let num_total_pixels = viewport_size.x * viewport_size.y;
let broken_pixels_fraction = 0.04 / 100.0;
let max_broken_pixels = (num_total_pixels * broken_pixels_fraction).round() as usize;
let threshold = 2.0;
#[expect(clippy::disallowed_methods)]
SnapshotOptions::new()
.threshold(threshold)
.max_failed_pixels(strict_on_ci(10, max_broken_pixels))
}