use std::cell::RefCell;
use std::rc::Rc;
use egui_kittest::Harness;
use egui_kittest::wgpu::{WgpuTestRenderer, create_render_state, default_wgpu_setup};
use siplot::egui::{self, Color32, Pos2};
use siplot::{PlotWidget, Symbol, YAxis};
const W: usize = 400;
const H: usize = 300;
fn is_red(px: [u8; 4]) -> bool {
px[0] > 150 && px[1] < 100 && px[2] < 100
}
fn render_markers(markers: &[(Symbol, f64, f64)]) -> (Vec<u8>, Vec<Pos2>) {
let rs = create_render_state(default_wgpu_setup());
siplot::install(&rs);
let mut plot = PlotWidget::new(&rs, 0);
for &(symbol, x, y) in markers {
plot.add_point_marker(x, y, Color32::RED, symbol);
}
plot.set_show_colorbar(false);
plot.set_auto_reset_zoom(false);
plot.set_graph_x_limits(0.0, 1.0);
plot.set_graph_y_limits(0.0, 1.0, YAxis::Left);
let app = Rc::new(RefCell::new(plot));
let app_ui = app.clone();
let renderer = WgpuTestRenderer::from_render_state(rs);
let mut harness = Harness::builder()
.with_size(egui::vec2(W as f32, H as f32))
.with_pixels_per_point(1.0)
.renderer(renderer)
.build_ui(move |ui| {
app_ui.borrow_mut().show(ui);
});
harness.step();
harness.step();
let image = harness.render().expect("headless wgpu render");
let raw = image.as_raw().to_vec();
let projected = markers
.iter()
.map(|&(_, x, y)| {
app.borrow()
.data_to_pixel(x, y, YAxis::Left)
.expect("display transform cached after render")
})
.collect();
(raw, projected)
}
fn pixel_at(raw: &[u8], x: f32, y: f32) -> [u8; 4] {
let col = x.round() as i64;
let row = y.round() as i64;
assert!(
col >= 0 && (col as usize) < W && row >= 0 && (row as usize) < H,
"probe ({x:.1},{y:.1}) is outside the {W}x{H} frame"
);
let i = (row as usize * W + col as usize) * 4;
[raw[i], raw[i + 1], raw[i + 2], raw[i + 3]]
}
#[test]
fn newly_catalogued_marker_symbols_render_geometry() {
let (raw, centers) = render_markers(&[
(Symbol::Heart, 0.25, 0.5),
(Symbol::HorizontalLine, 0.5, 0.5),
(Symbol::VerticalLine, 0.75, 0.5),
]);
for (label, c) in [
("Heart", centers[0]),
("HorizontalLine", centers[1]),
("VerticalLine", centers[2]),
] {
let px = pixel_at(&raw, c.x, c.y);
assert!(
is_red(px),
"the {label} marker glyph must paint red at its center: px={px:?}"
);
}
let empty = pixel_at(&raw, centers[1].x, centers[1].y - 60.0);
assert!(
!is_red(empty),
"the data area away from any marker must be background, not red: empty={empty:?}"
);
}