use kui_core::testing::{click, hover, press, release, tab};
use kui_core::{Core, NodeSpec, Size, TextStyle, Vec2};
const VIEW: Size = Size { w: 300.0, h: 200.0 };
fn frame(core: &mut Core, on_button: bool, on_row: bool) {
let mut ui = core.frame(VIEW, 1.0);
ui.with(NodeSpec::row(), |ui| {
ui.leaf_keyed("sink", NodeSpec::row().size(100.0, 50.0).on_key("keys"));
let row = NodeSpec::row();
ui.with_keyed("bar", if on_row { row.keep_focus() } else { row }, |ui| {
let b = NodeSpec::row().size(100.0, 50.0).on_click("go");
ui.leaf_keyed("button", if on_button { b.keep_focus() } else { b });
});
});
ui.finish();
}
fn pressed(on_button: bool, on_row: bool) -> (Core, Vec<kui_core::UiEvent>) {
let mut core = Core::new();
frame(&mut core, on_button, on_row);
let sink = core.key_of("sink").unwrap();
core.set_key_focus(Some(sink));
frame(&mut core, on_button, on_row);
let evs = click(&mut core, Vec2::new(150.0, 25.0));
(core, evs)
}
#[test]
fn a_press_on_a_keep_focus_node_acts_and_leaves_the_sink_focused() {
for (on_button, on_row) in [(true, false), (false, true)] {
let (mut core, evs) = pressed(on_button, on_row);
let sink = core.key_of("sink");
assert!(
evs.iter().any(|e| e.payload.as_str() == Some("go")),
"the click still lands"
);
assert_eq!(core.key_focus(), sink, "button {on_button}, row {on_row}");
}
}
#[test]
fn without_it_a_press_focuses_the_button_and_tab_still_reaches_it() {
let (mut core, _) = pressed(false, false);
assert_eq!(core.key_focus(), core.key_of("button"), "as before");
let mut core = Core::new();
frame(&mut core, true, false);
tab(&mut core, true);
assert_eq!(core.key_focus(), core.key_of("button"));
}
fn card(core: &mut Core, keep: bool) {
let mut ui = core.frame(VIEW, 1.0);
ui.with(NodeSpec::column(), |ui| {
ui.text_in_keyed(
"card",
NodeSpec::row().size(300.0, 40.0).selectable(),
"hello brave world",
TextStyle::new(14.0),
);
let copy = NodeSpec::row().size(100.0, 40.0).on_click("copy");
ui.leaf_keyed("copy", if keep { copy.keep_focus() } else { copy });
});
ui.finish();
}
#[test]
fn a_press_on_a_keep_focus_node_leaves_the_selection_it_acts_on() {
for keep in [true, false] {
let mut core = Core::new();
card(&mut core, keep);
press(&mut core, Vec2::new(2.0, 8.0));
hover(&mut core, Vec2::new(200.0, 8.0));
release(&mut core);
card(&mut core, keep);
let selected = core.selection();
assert!(selected.is_some(), "the drag selected");
let evs = click(&mut core, Vec2::new(50.0, 60.0));
assert!(
evs.iter().any(|e| e.payload.as_str() == Some("copy")),
"the click lands"
);
if keep {
assert_eq!(core.selection(), selected);
} else {
assert_eq!(core.selection(), None, "any other press ends it");
}
}
}
fn toolbar(core: &mut Core) {
let mut ui = core.frame(VIEW, 1.0);
ui.with(NodeSpec::column(), |ui| {
ui.leaf_keyed("a", NodeSpec::row().size(100.0, 30.0).on_click("a"));
ui.leaf_keyed("b", NodeSpec::row().size(100.0, 30.0).on_click("b"));
ui.with_keyed(
"bar",
NodeSpec::row().size(300.0, 30.0).focus_region(),
|ui| {
ui.leaf_keyed(
"bold",
NodeSpec::row()
.size(100.0, 30.0)
.on_click("bold")
.keep_focus(),
);
ui.leaf_keyed("plain", NodeSpec::row().size(100.0, 30.0).on_click("plain"));
},
);
});
ui.finish();
}
#[test]
fn a_press_on_a_keep_focus_node_leaves_the_ring_where_the_keyboard_is() {
let mut core = Core::new();
toolbar(&mut core);
tab(&mut core, false);
assert_eq!(core.key_focus(), core.key_of("a"));
let region = core.region();
let evs = click(&mut core, Vec2::new(50.0, 75.0));
assert!(evs.iter().any(|e| e.payload.as_str() == Some("bold")));
assert_eq!(core.key_focus(), core.key_of("a"));
assert_eq!(core.region(), region, "the ring is the keyboard's");
tab(&mut core, false);
assert_eq!(core.key_focus(), core.key_of("b"));
}