#![cfg(not(debug_assertions))]
use smix_screen::{A11yNode, Rect, is_visible_enough, visible_area};
use std::hint::black_box;
use std::time::Instant;
const ITERATIONS: u32 = 200_000;
const WARMUP_FRAC: u32 = 10;
fn mk(bounds: Rect) -> A11yNode {
A11yNode {
raw_type: "other".into(),
role: None,
identifier: None,
label: None,
title: None,
placeholder_value: None,
value: None,
text: None,
bounds,
enabled: true,
selected: false,
has_focus: false,
visible: true,
children: vec![],
}
}
fn rect(x: f64, y: f64, w: f64, h: f64) -> Rect {
Rect { x, y, w, h }
}
fn measure_ns<F: FnMut()>(mut body: F, iterations: u32) -> f64 {
let warmup = iterations / WARMUP_FRAC;
for _ in 0..warmup {
body();
}
let measured = iterations - warmup;
let start = Instant::now();
for _ in 0..measured {
body();
}
let elapsed = start.elapsed();
elapsed.as_nanos() as f64 / measured as f64
}
#[test]
fn perf_gate_is_visible_enough_in_view() {
let node = mk(rect(20.0, 100.0, 200.0, 44.0));
let tree = mk(rect(0.0, 0.0, 390.0, 844.0));
let ns = measure_ns(
|| {
black_box(is_visible_enough(black_box(&node), black_box(&tree)));
},
ITERATIONS,
);
assert!(
ns < 15.0,
"is_visible_enough in-view exceeded 15 ns budget: {:.2} ns/iter",
ns
);
}
#[test]
fn perf_gate_is_visible_enough_zero_reject() {
let node = mk(rect(50.0, 50.0, 0.0, 0.0));
let tree = mk(rect(0.0, 0.0, 390.0, 844.0));
let ns = measure_ns(
|| {
black_box(is_visible_enough(black_box(&node), black_box(&tree)));
},
ITERATIONS,
);
assert!(
ns < 10.0,
"is_visible_enough zero-reject exceeded 10 ns budget: {:.2} ns/iter",
ns
);
}
#[test]
fn perf_gate_visible_area_in_view() {
let node = mk(rect(20.0, 100.0, 200.0, 44.0));
let tree = mk(rect(0.0, 0.0, 390.0, 844.0));
let ns = measure_ns(
|| {
black_box(visible_area(black_box(&node), black_box(&tree)));
},
ITERATIONS,
);
assert!(
ns < 15.0,
"visible_area in-view exceeded 15 ns budget: {:.2} ns/iter",
ns
);
}