dear-imgui-rs 0.18.0

High-level Rust bindings to Dear ImGui v1.92.9b with docking, WGPU/GL backends, and extensions (ImPlot/ImPlot3D, ImNodes, ImGuizmo, file browser, reflection-based UI)
Documentation
use dear_imgui_rs::{self as imgui, PlotValueOffset};
use std::sync::{Mutex, OnceLock};

fn test_guard() -> std::sync::MutexGuard<'static, ()> {
    static GUARD: OnceLock<Mutex<()>> = OnceLock::new();
    GUARD.get_or_init(|| Mutex::new(())).lock().unwrap()
}

#[test]
fn plot_widgets_validate_value_offsets() {
    let _guard = test_guard();

    let mut ctx = imgui::Context::create();
    {
        let io = ctx.io_mut();
        io.set_display_size([800.0, 600.0]);
        io.set_delta_time(1.0 / 60.0);
    }
    ctx.font_atlas()
        .try_claim_legacy_renderer()
        .expect("legacy renderer font atlas should be available")
        .build();
    let _ = ctx.set_ini_filename::<std::path::PathBuf>(None);

    let ui = ctx.frame();
    let values = [0.0f32, 1.0, 0.5];
    let empty: [f32; 0] = [];

    let _ = ui.window("Plots").build(|| {
        ui.plot_lines("empty_lines", &empty);
        ui.plot_histogram("empty_histogram", &empty);
        ui.plot_lines_config("offset_lines", &values)
            .values_offset(2usize)
            .build();
        ui.plot_histogram_config("offset_histogram", &values)
            .values_offset(PlotValueOffset::new(2))
            .build();
        assert!(
            std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
                ui.plot_lines_config("too_large_lines", &values)
                    .values_offset(values.len())
                    .build();
            }))
            .is_err()
        );
        assert!(
            std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
                ui.plot_histogram_config("too_large_histogram", &values)
                    .values_offset(values.len())
                    .build();
            }))
            .is_err()
        );
        assert!(
            std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
                ui.plot_lines_config("overflow_lines", &values)
                    .values_offset(PlotValueOffset::new(i32::MAX as usize + 1))
                    .build();
            }))
            .is_err()
        );
    });
}