use oxiui_core::UiCtx;
use oxiui_egui::EguiUiCtx;
fn make_ctx() -> egui::Context {
egui::Context::default()
}
fn run_frame<F: FnMut(&mut EguiUiCtx<'_>)>(ctx: &egui::Context, mut f: F) {
let raw_input = egui::RawInput::default();
let _ = ctx.run_ui(raw_input, |ui| {
let mut adapter = EguiUiCtx::new(ui);
f(&mut adapter);
});
}
#[test]
fn text_input_forwards_seed_and_reports_supported() {
let ctx = make_ctx();
run_frame(&ctx, |adapter| {
let resp = adapter.text_input("hello");
assert!(resp.supported);
assert_eq!(resp.text, "hello");
});
}
#[test]
fn checkbox_forwards_state() {
let ctx = make_ctx();
run_frame(&ctx, |adapter| {
let resp = adapter.checkbox("opt", true);
assert!(resp.supported);
assert!(resp.checked);
});
}
#[test]
fn slider_reports_value_in_range() {
let ctx = make_ctx();
run_frame(&ctx, |adapter| {
let resp = adapter.slider(0.5, 0.0..=1.0);
assert!(resp.supported);
assert!(resp.value >= 0.0 && resp.value <= 1.0);
});
}
#[test]
fn dropdown_returns_selected() {
let ctx = make_ctx();
run_frame(&ctx, |adapter| {
let resp = adapter.dropdown(&["a", "b", "c"], 1);
assert!(resp.supported);
assert_eq!(resp.selected, 1);
});
}
#[test]
fn dropdown_two_widgets_no_id_panic() {
let ctx = make_ctx();
run_frame(&ctx, |adapter| {
let r1 = adapter.dropdown(&["x", "y"], 0);
let r2 = adapter.dropdown(&["p", "q"], 0);
assert!(r1.supported);
assert!(r2.supported);
});
}
#[test]
fn separator_supported() {
let ctx = make_ctx();
run_frame(&ctx, |adapter| {
let resp = adapter.separator();
assert!(resp.supported);
});
}
#[test]
fn spacer_supported() {
let ctx = make_ctx();
run_frame(&ctx, |adapter| {
let resp = adapter.spacer(16.0);
assert!(resp.supported);
});
}
#[test]
fn image_supported_without_loader() {
let ctx = make_ctx();
run_frame(&ctx, |adapter| {
let resp = adapter.image("file://nonexistent.png", None);
assert!(resp.supported);
});
}
#[test]
fn scroll_area_invokes_content_closure() {
let ctx = make_ctx();
let mut invoked = false;
run_frame(&ctx, |adapter| {
let resp = adapter.scroll_area(&mut |inner| {
invoked = true;
inner.label("inside scroll");
});
assert!(resp.supported);
});
assert!(invoked, "scroll_area must invoke the content closure");
}
#[test]
fn tooltip_no_prior_widget_unsupported() {
let ctx = make_ctx();
run_frame(&ctx, |adapter| {
let resp = adapter.tooltip("tip text");
assert!(!resp.supported);
});
}
#[test]
fn tooltip_attaches_after_separator() {
let ctx = make_ctx();
run_frame(&ctx, |adapter| {
adapter.separator();
let resp = adapter.tooltip("hover text");
assert!(resp.supported);
});
}
#[test]
fn response_accessor_returns_last_widget() {
let ctx = make_ctx();
run_frame(&ctx, |adapter| {
assert!(adapter.response().is_none());
adapter.separator();
assert!(adapter.response().is_some());
});
}
#[test]
fn popup_invokes_content_closure() {
let ctx = make_ctx();
let mut invoked = false;
run_frame(&ctx, |adapter| {
let resp = adapter.popup(&mut |inner| {
invoked = true;
inner.label("popup content");
});
assert!(resp.supported);
});
assert!(invoked, "popup must invoke the content closure");
}
#[test]
fn modal_invokes_content_closure() {
let ctx = make_ctx();
let mut invoked = false;
run_frame(&ctx, |adapter| {
let resp = adapter.modal("Dialog", &mut |inner| {
invoked = true;
inner.label("modal body");
});
assert!(resp.supported);
});
assert!(invoked, "modal must invoke the content closure");
}
#[test]
fn load_font_empty_bytes_is_err() {
let ctx = make_ctx();
let result = oxiui_egui::load_font_into_egui(&ctx, vec![]);
assert!(result.is_err(), "empty font bytes must return Err");
}