use std::cell::RefCell;
use std::rc::Rc;
use egui_kittest::Harness;
use egui_kittest::kittest::Queryable;
use egui_kittest::wgpu::{WgpuTestRenderer, create_render_state, default_wgpu_setup};
use rsplot::egui;
use rsplot::{ComplexImageView, ComplexMode};
fn view_harness() -> (Rc<RefCell<ComplexImageView>>, Harness<'static>) {
let rs = create_render_state(default_wgpu_setup());
rsplot::install(&rs);
let mut view = ComplexImageView::new(&rs, 0);
let data = [(3.0f32, 4.0f32), (1.0, 0.0), (0.0, 1.0), (2.0, 0.0)];
view.set_data(2, 2, &data).expect("2x2 data");
view.set_mode(ComplexMode::Log10AmplitudePhase);
let view = Rc::new(RefCell::new(view));
let view_ui = view.clone();
let renderer = WgpuTestRenderer::from_render_state(rs.clone());
let harness = Harness::builder()
.with_size(egui::vec2(700.0, 300.0))
.with_pixels_per_point(1.0)
.renderer(renderer)
.build_ui(move |ui| {
view_ui.borrow_mut().show_amplitude_range_controls(ui);
view_ui.borrow_mut().show(ui);
});
(view, harness)
}
#[test]
fn autoscale_checkbox_toggles_the_displayed_max() {
let (view, mut harness) = view_harness();
harness.step();
harness.step();
assert_eq!(view.borrow().amplitude_range_info(), (None, 2.0));
harness.get_by_label("autoscale").click();
harness.step();
harness.step();
let (max, delta) = view.borrow().amplitude_range_info();
let max = max.expect("leaving autoscale seeds an explicit displayed max");
assert!(
(max - 5.0).abs() < 1e-4,
"displayed max must seed from the data max amplitude (5.0), got {max}"
);
assert_eq!(delta, 2.0, "delta is unchanged by the autoscale toggle");
harness.get_by_label("autoscale").click();
harness.step();
harness.step();
assert_eq!(view.borrow().amplitude_range_info().0, None);
}
#[test]
fn dragging_the_displayed_max_when_enabled_changes_the_range() {
let (view, mut harness) = view_harness();
harness.step();
harness.step();
harness.get_by_label("autoscale").click();
harness.step();
harness.step();
assert!((view.borrow().amplitude_range_info().0.unwrap() - 5.0).abs() < 1e-4);
let max_rect = harness
.get_all_by_role(egui::accesskit::Role::SpinButton)
.next()
.expect("the max drag-value is present")
.rect();
let start = max_rect.center();
let end = egui::pos2(start.x + 60.0, start.y);
harness.drag_at(start);
harness.step();
for t in [0.0f32, 0.25, 0.5, 0.75, 1.0] {
harness.hover_at(start + (end - start) * t);
harness.step();
}
harness.drop_at(end);
harness.step();
harness.step();
let max = view
.borrow()
.amplitude_range_info()
.0
.expect("max stays explicit");
assert!(
max > 5.0,
"dragging the enabled displayed-max drag-value right must raise it above \
the seeded 5.0, got {max}"
);
}
#[test]
fn dragging_the_delta_changes_the_log_decades() {
let (view, mut harness) = view_harness();
harness.step();
harness.step();
assert_eq!(view.borrow().amplitude_range_info().1, 2.0);
let delta_rect = {
let nodes = harness.get_all_by_role(egui::accesskit::Role::SpinButton);
nodes.last().expect("a delta drag-value is present").rect()
};
let start = delta_rect.center();
let end = egui::pos2(start.x + 80.0, start.y);
harness.drag_at(start);
harness.step();
for t in [0.0f32, 0.25, 0.5, 0.75, 1.0] {
harness.hover_at(start + (end - start) * t);
harness.step();
}
harness.drop_at(end);
harness.step();
harness.step();
let delta = view.borrow().amplitude_range_info().1;
assert!(
delta > 2.0,
"dragging the delta drag-value right must raise the log-decade count \
above the 2.0 default, got {delta}"
);
}